mirror of https://github.com/OpenVidu/openvidu.git
Compare commits
12 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
10e643ce86 | |
|
|
b704a9ceea | |
|
|
2d2da5a659 | |
|
|
ebac5b30c2 | |
|
|
34e34ee078 | |
|
|
87b3ac3716 | |
|
|
677862f5eb | |
|
|
28ca0c95cf | |
|
|
8e643670f4 | |
|
|
3bed3c13f9 | |
|
|
234a155894 | |
|
|
6f1486493a |
|
|
@ -27,11 +27,11 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.commit_sha || github.sha }}
|
ref: ${{ inputs.commit_sha || github.sha }}
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
- name: Commit URL
|
- name: Commit URL
|
||||||
|
|
@ -86,11 +86,11 @@ jobs:
|
||||||
script: e2e:lib-virtual-backgrounds
|
script: e2e:lib-virtual-backgrounds
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.commit_sha || github.sha }}
|
ref: ${{ inputs.commit_sha || github.sha }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
- name: Install wait-on package
|
- name: Install wait-on package
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,14 @@ jobs:
|
||||||
curl -sSL https://get.livekit.io/cli | bash
|
curl -sSL https://get.livekit.io/cli | bash
|
||||||
|
|
||||||
- name: Checkout current repository
|
- name: Checkout current repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
path: openvidu
|
path: openvidu
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
working-directory: ./openvidu/openvidu-test-integration
|
working-directory: ./openvidu/openvidu-test-integration
|
||||||
|
|
@ -44,7 +44,7 @@ jobs:
|
||||||
run: npm run test:ci
|
run: npm run test:ci
|
||||||
|
|
||||||
- name: Upload report
|
- name: Upload report
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: openvidu-integration-tests-report
|
name: openvidu-integration-tests-report
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -4,14 +4,14 @@
|
||||||
id="camera-btn"
|
id="camera-btn"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
(click)="onCameraToggle()"
|
(click)="onCameraToggle()"
|
||||||
[disabled]="isConnectionLost || !hasVideoDevices || cameraMuteChanging"
|
[disabled]="isConnectionLost() || !hasVideoDevices() || cameraMuteChanging()"
|
||||||
[class.disabled]="!isCameraEnabled"
|
[class.disabled]="!isCameraEnabled()"
|
||||||
[class.mobile-btn]="isMobileView()"
|
[class.mobile-btn]="isMobileView()"
|
||||||
[matTooltip]="isCameraEnabled ? ('TOOLBAR.STOP_VIDEO' | translate) : ('TOOLBAR.START_VIDEO' | translate)"
|
[matTooltip]="isCameraEnabled() ? ('TOOLBAR.STOP_VIDEO' | translate) : ('TOOLBAR.START_VIDEO' | translate)"
|
||||||
[matTooltipDisabled]="!hasVideoDevices"
|
[matTooltipDisabled]="!hasVideoDevices()"
|
||||||
>
|
>
|
||||||
<mat-icon [id]="isCameraEnabled ? 'videocam' : 'videocam_off'">
|
<mat-icon [id]="isCameraEnabled() ? 'videocam' : 'videocam_off'">
|
||||||
{{ isCameraEnabled ? 'videocam' : 'videocam_off' }}
|
{{ isCameraEnabled() ? 'videocam' : 'videocam_off' }}
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
@ -22,29 +22,42 @@
|
||||||
id="mic-btn"
|
id="mic-btn"
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
(click)="onMicrophoneToggle()"
|
(click)="onMicrophoneToggle()"
|
||||||
[disabled]="isConnectionLost || !hasAudioDevices || microphoneMuteChanging"
|
[disabled]="isConnectionLost() || !hasAudioDevices() || microphoneMuteChanging()"
|
||||||
[class.disabled]="!isMicrophoneEnabled"
|
[class.disabled]="!isMicrophoneEnabled()"
|
||||||
[class.mobile-btn]="isMobileView()"
|
[class.mobile-btn]="isMobileView()"
|
||||||
[matTooltip]="isMicrophoneEnabled ? ('TOOLBAR.MUTE_AUDIO' | translate) : ('TOOLBAR.UNMUTE_AUDIO' | translate)"
|
[matTooltip]="isMicrophoneEnabled() ? ('TOOLBAR.MUTE_AUDIO' | translate) : ('TOOLBAR.UNMUTE_AUDIO' | translate)"
|
||||||
[matTooltipDisabled]="!hasAudioDevices"
|
[matTooltipDisabled]="!hasAudioDevices()"
|
||||||
>
|
>
|
||||||
<mat-icon [id]="isMicrophoneEnabled ? 'mic' : 'mic_off'">
|
<mat-icon [id]="isMicrophoneEnabled() ? 'mic' : 'mic_off'">
|
||||||
{{ isMicrophoneEnabled ? 'mic' : 'mic_off' }}
|
{{ isMicrophoneEnabled() ? 'mic' : 'mic_off' }}
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Screenshare button - Only visible on tablet+ or when active -->
|
<!-- Screenshare button - Only visible on tablet+ or when active -->
|
||||||
@if (showScreenshareButtonDirect()) {
|
@if (showScreenshareButtonDirect()) {
|
||||||
|
@if (isFirefoxBrowser()) {
|
||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
id="screenshare-btn"
|
id="screenshare-btn"
|
||||||
[matMenuTriggerFor]="isScreenShareEnabled ? screenshareMenu : null"
|
[disabled]="isConnectionLost()"
|
||||||
[disabled]="isConnectionLost"
|
[class.active-btn]="isScreenShareEnabled()"
|
||||||
[class.active-btn]="isScreenShareEnabled"
|
|
||||||
[class.mobile-btn]="isMobileView()"
|
[class.mobile-btn]="isMobileView()"
|
||||||
matTooltip="{{ isScreenShareEnabled ? ('TOOLBAR.DISABLE_SCREEN' | translate) : ('TOOLBAR.ENABLE_SCREEN' | translate) }}"
|
matTooltip="{{ isScreenShareEnabled() ? ('TOOLBAR.DISABLE_SCREEN' | translate) : ('TOOLBAR.ENABLE_SCREEN' | translate) }}"
|
||||||
(click)="!isScreenShareEnabled && onScreenShareToggle()"
|
(click)="onScreenShareToggle()"
|
||||||
|
>
|
||||||
|
<mat-icon>screen_share</mat-icon>
|
||||||
|
</button>
|
||||||
|
} @else {
|
||||||
|
<button
|
||||||
|
mat-icon-button
|
||||||
|
id="screenshare-btn"
|
||||||
|
[matMenuTriggerFor]="isScreenShareEnabled() ? screenshareMenu : null"
|
||||||
|
[disabled]="isConnectionLost()"
|
||||||
|
[class.active-btn]="isScreenShareEnabled()"
|
||||||
|
[class.mobile-btn]="isMobileView()"
|
||||||
|
matTooltip="{{ isScreenShareEnabled() ? ('TOOLBAR.DISABLE_SCREEN' | translate) : ('TOOLBAR.ENABLE_SCREEN' | translate) }}"
|
||||||
|
(click)="!isScreenShareEnabled() && onScreenShareToggle()"
|
||||||
>
|
>
|
||||||
<mat-icon>screen_share</mat-icon>
|
<mat-icon>screen_share</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -61,11 +74,12 @@
|
||||||
<span>{{ 'TOOLBAR.DISABLE_SCREEN' | translate }}</span>
|
<span>{{ 'TOOLBAR.DISABLE_SCREEN' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Additional buttons injection from parent component (desktop/tablet only) -->
|
<!-- Additional buttons injection from parent component (desktop/tablet only) -->
|
||||||
@if (showAdditionalButtonsOutside() && additionalButtonsPosition === 'beforeMenu') {
|
@if (showAdditionalButtonsOutside() && additionalButtonsPosition() === 'beforeMenu') {
|
||||||
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate; context: { $implicit: additionalButtonsPosition }"></ng-container>
|
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }"></ng-container>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- More options button -->
|
<!-- More options button -->
|
||||||
|
|
@ -74,7 +88,7 @@
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
id="more-options-btn"
|
id="more-options-btn"
|
||||||
[matMenuTriggerFor]="settingsMenu"
|
[matMenuTriggerFor]="settingsMenu"
|
||||||
[disabled]="isConnectionLost"
|
[disabled]="isConnectionLost()"
|
||||||
[class.mobile-btn]="isMobileView()"
|
[class.mobile-btn]="isMobileView()"
|
||||||
matTooltip="{{ 'TOOLBAR.MORE_OPTIONS' | translate }}"
|
matTooltip="{{ 'TOOLBAR.MORE_OPTIONS' | translate }}"
|
||||||
>
|
>
|
||||||
|
|
@ -82,38 +96,38 @@
|
||||||
</button>
|
</button>
|
||||||
<mat-menu #settingsMenu="matMenu" id="more-options-menu">
|
<mat-menu #settingsMenu="matMenu" id="more-options-menu">
|
||||||
<!-- Additional buttons injection inside menu (mobile only) -->
|
<!-- Additional buttons injection inside menu (mobile only) -->
|
||||||
@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition === 'beforeMenu') {
|
@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition() === 'beforeMenu') {
|
||||||
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate; context: { $implicit: additionalButtonsPosition }">
|
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }">
|
||||||
</ng-container>
|
</ng-container>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Fullscreen button -->
|
<!-- Fullscreen button -->
|
||||||
@if (showFullscreenButton) {
|
@if (showFullscreenButton()) {
|
||||||
<button mat-menu-item id="fullscreen-btn" (click)="onFullscreenToggle()">
|
<button mat-menu-item id="fullscreen-btn" (click)="onFullscreenToggle()">
|
||||||
<mat-icon>{{ isFullscreenActive ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>
|
<mat-icon>{{ isFullscreenActive() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>
|
||||||
<span>{{ isFullscreenActive ? ('TOOLBAR.EXIT_FULLSCREEN' | translate) : ('TOOLBAR.FULLSCREEN' | translate) }}</span>
|
<span>{{ isFullscreenActive() ? ('TOOLBAR.EXIT_FULLSCREEN' | translate) : ('TOOLBAR.FULLSCREEN' | translate) }}</span>
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Recording button -->
|
<!-- Recording button -->
|
||||||
@if (showRecordingButton) {
|
@if (showRecordingButton()) {
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
id="recording-btn"
|
id="recording-btn"
|
||||||
[disabled]="
|
[disabled]="
|
||||||
recordingStatus === _recordingStatus.STARTING ||
|
recordingStatus() === _recordingStatus.STARTING ||
|
||||||
recordingStatus === _recordingStatus.STOPPING ||
|
recordingStatus() === _recordingStatus.STOPPING ||
|
||||||
!hasRoomTracksPublished
|
!hasRoomTracksPublished()
|
||||||
"
|
"
|
||||||
[matTooltip]="!hasRoomTracksPublished ? ('TOOLBAR.NO_TRACKS_PUBLISHED' | translate) : ''"
|
[matTooltip]="!hasRoomTracksPublished() ? ('TOOLBAR.NO_TRACKS_PUBLISHED' | translate) : ''"
|
||||||
(click)="onRecordingToggle()"
|
(click)="onRecordingToggle()"
|
||||||
>
|
>
|
||||||
<mat-icon color="warn">radio_button_checked</mat-icon>
|
<mat-icon color="warn">radio_button_checked</mat-icon>
|
||||||
<span>
|
<span>
|
||||||
{{
|
{{
|
||||||
recordingStatus === _recordingStatus.STOPPED ||
|
recordingStatus() === _recordingStatus.STOPPED ||
|
||||||
recordingStatus === _recordingStatus.STOPPING ||
|
recordingStatus() === _recordingStatus.STOPPING ||
|
||||||
recordingStatus === _recordingStatus.FAILED
|
recordingStatus() === _recordingStatus.FAILED
|
||||||
? ('TOOLBAR.START_RECORDING' | translate)
|
? ('TOOLBAR.START_RECORDING' | translate)
|
||||||
: ('TOOLBAR.STOP_RECORDING' | translate)
|
: ('TOOLBAR.STOP_RECORDING' | translate)
|
||||||
}}
|
}}
|
||||||
|
|
@ -122,7 +136,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- View recordings button -->
|
<!-- View recordings button -->
|
||||||
@if (showViewRecordingsButton) {
|
@if (showViewRecordingsButton()) {
|
||||||
<button mat-menu-item id="view-recordings-btn" (click)="onViewRecordingsClick()">
|
<button mat-menu-item id="view-recordings-btn" (click)="onViewRecordingsClick()">
|
||||||
<mat-icon>video_library</mat-icon>
|
<mat-icon>video_library</mat-icon>
|
||||||
<span>{{ 'TOOLBAR.VIEW_RECORDINGS' | translate }}</span>
|
<span>{{ 'TOOLBAR.VIEW_RECORDINGS' | translate }}</span>
|
||||||
|
|
@ -130,19 +144,19 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Broadcasting button -->
|
<!-- Broadcasting button -->
|
||||||
@if (showBroadcastingButton) {
|
@if (showBroadcastingButton()) {
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
id="toolbar-broadcasting-btn"
|
id="toolbar-broadcasting-btn"
|
||||||
[disabled]="broadcastingStatus === _broadcastingStatus.STARTING || recordingStatus === _broadcastingStatus.STOPPING"
|
[disabled]="broadcastingStatus() === _broadcastingStatus.STARTING || recordingStatus() === _broadcastingStatus.STOPPING"
|
||||||
(click)="onBroadcastingToggle()"
|
(click)="onBroadcastingToggle()"
|
||||||
>
|
>
|
||||||
<mat-icon>sensors</mat-icon>
|
<mat-icon>sensors</mat-icon>
|
||||||
<span>
|
<span>
|
||||||
{{
|
{{
|
||||||
broadcastingStatus === _broadcastingStatus.STOPPED ||
|
broadcastingStatus() === _broadcastingStatus.STOPPED ||
|
||||||
broadcastingStatus === _broadcastingStatus.STOPPING ||
|
broadcastingStatus() === _broadcastingStatus.STOPPING ||
|
||||||
broadcastingStatus === _broadcastingStatus.FAILED
|
broadcastingStatus() === _broadcastingStatus.FAILED
|
||||||
? ('PANEL.STREAMING.START' | translate)
|
? ('PANEL.STREAMING.START' | translate)
|
||||||
: ('PANEL.STREAMING.STOP' | translate)
|
: ('PANEL.STREAMING.STOP' | translate)
|
||||||
}}
|
}}
|
||||||
|
|
@ -151,8 +165,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Virtual background button -->
|
<!-- Virtual background button -->
|
||||||
@if (showBackgroundEffectsButton) {
|
@if (showBackgroundEffectsButton()) {
|
||||||
<button mat-menu-item id="virtual-bg-btn" [disabled]="!isCameraEnabled" (click)="onBackgroundEffectsToggle()">
|
<button mat-menu-item id="virtual-bg-btn" [disabled]="!isCameraEnabled()" (click)="onBackgroundEffectsToggle()">
|
||||||
<mat-icon><span class="material-symbols-outlined">background_replace</span></mat-icon>
|
<mat-icon><span class="material-symbols-outlined">background_replace</span></mat-icon>
|
||||||
<span>{{ 'TOOLBAR.BACKGROUND' | translate }}</span>
|
<span>{{ 'TOOLBAR.BACKGROUND' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -172,8 +186,8 @@
|
||||||
</button> -->
|
</button> -->
|
||||||
|
|
||||||
<!-- Additional buttons injection inside menu (mobile only) -->
|
<!-- Additional buttons injection inside menu (mobile only) -->
|
||||||
@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition === 'afterMenu') {
|
@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition() === 'afterMenu') {
|
||||||
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate; context: { $implicit: additionalButtonsPosition }">
|
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }">
|
||||||
</ng-container>
|
</ng-container>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,12 +197,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Divider before settings -->
|
<!-- Divider before settings -->
|
||||||
@if (showSettingsButton) {
|
@if (showSettingsButton()) {
|
||||||
<mat-divider class="divider"></mat-divider>
|
<mat-divider class="divider"></mat-divider>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Settings button -->
|
<!-- Settings button -->
|
||||||
@if (showSettingsButton) {
|
@if (showSettingsButton()) {
|
||||||
<button mat-menu-item id="toolbar-settings-btn" (click)="onSettingsToggle()">
|
<button mat-menu-item id="toolbar-settings-btn" (click)="onSettingsToggle()">
|
||||||
<mat-icon>settings</mat-icon>
|
<mat-icon>settings</mat-icon>
|
||||||
<span>{{ 'TOOLBAR.SETTINGS' | translate }}</span>
|
<span>{{ 'TOOLBAR.SETTINGS' | translate }}</span>
|
||||||
|
|
@ -198,12 +212,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Additional buttons injection from parent component (desktop/tablet only) -->
|
<!-- Additional buttons injection from parent component (desktop/tablet only) -->
|
||||||
@if (showAdditionalButtonsOutside() && additionalButtonsPosition === 'afterMenu') {
|
@if (showAdditionalButtonsOutside() && additionalButtonsPosition() === 'afterMenu') {
|
||||||
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate"></ng-container>
|
<ng-container *ngTemplateOutlet="toolbarAdditionalButtonsTemplate()"></ng-container>
|
||||||
}
|
}
|
||||||
|
|
||||||
<!-- Leave session button -->
|
<!-- Leave session button -->
|
||||||
@if (showLeaveButton) {
|
@if (showLeaveButton()) {
|
||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
(click)="onLeaveClick()"
|
(click)="onLeaveClick()"
|
||||||
|
|
@ -215,6 +229,6 @@
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (toolbarLeaveButtonTemplate) {
|
@if (toolbarLeaveButtonTemplate()) {
|
||||||
<ng-container *ngTemplateOutlet="toolbarLeaveButtonTemplate"></ng-container>
|
<ng-container *ngTemplateOutlet="toolbarLeaveButtonTemplate()"></ng-container>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { Component, ContentChild, EventEmitter, Input, Output, TemplateRef, computed, inject } from '@angular/core';
|
import { Component, ContentChild, EventEmitter, Output, TemplateRef, computed, inject, input } from '@angular/core';
|
||||||
import { RecordingStatus } from '../../../models/recording.model';
|
import { RecordingStatus } from '../../../models/recording.model';
|
||||||
import { BroadcastingStatus } from '../../../models/broadcasting.model';
|
import { BroadcastingStatus } from '../../../models/broadcasting.model';
|
||||||
import { ToolbarAdditionalButtonsPosition } from '../../../models/toolbar.model';
|
import { ToolbarAdditionalButtonsPosition } from '../../../models/toolbar.model';
|
||||||
|
|
@ -16,61 +16,62 @@ import { ToolbarMoreOptionsAdditionalMenuItemsDirective } from '../../../directi
|
||||||
})
|
})
|
||||||
export class ToolbarMediaButtonsComponent {
|
export class ToolbarMediaButtonsComponent {
|
||||||
// Camera related inputs
|
// Camera related inputs
|
||||||
@Input() showCameraButton: boolean = true;
|
showCameraButton = input<boolean>(true);
|
||||||
@Input() isCameraEnabled: boolean = true;
|
isCameraEnabled = input<boolean>(true);
|
||||||
@Input() cameraMuteChanging: boolean = false;
|
cameraMuteChanging = input<boolean>(false);
|
||||||
|
|
||||||
// Microphone related inputs
|
// Microphone related inputs
|
||||||
@Input() showMicrophoneButton: boolean = true;
|
showMicrophoneButton = input<boolean>(true);
|
||||||
@Input() isMicrophoneEnabled: boolean = true;
|
isMicrophoneEnabled = input<boolean>(true);
|
||||||
@Input() microphoneMuteChanging: boolean = false;
|
microphoneMuteChanging = input<boolean>(false);
|
||||||
|
|
||||||
// Screenshare related inputs
|
// Screenshare related inputs
|
||||||
@Input() showScreenshareButton: boolean = true;
|
showScreenshareButton = input<boolean>(true);
|
||||||
@Input() isScreenShareEnabled: boolean = false;
|
isScreenShareEnabled = input<boolean>(false);
|
||||||
|
isFirefoxBrowser = input<boolean>(false);
|
||||||
|
|
||||||
// Device availability inputs
|
// Device availability inputs
|
||||||
@Input() hasVideoDevices: boolean = true;
|
hasVideoDevices = input<boolean>(true);
|
||||||
@Input() hasAudioDevices: boolean = true;
|
hasAudioDevices = input<boolean>(true);
|
||||||
|
|
||||||
// Connection state inputs
|
// Connection state inputs
|
||||||
@Input() isConnectionLost: boolean = false;
|
isConnectionLost = input<boolean>(false);
|
||||||
|
|
||||||
// UI state inputs
|
// UI state inputs
|
||||||
@Input() isMinimal: boolean = false;
|
isMinimal = input<boolean>(false);
|
||||||
|
|
||||||
// More options menu inputs
|
// More options menu inputs
|
||||||
@Input() showMoreOptionsButton: boolean = true;
|
showMoreOptionsButton = input<boolean>(true);
|
||||||
@Input() showFullscreenButton: boolean = true;
|
showFullscreenButton = input<boolean>(true);
|
||||||
@Input() showRecordingButton: boolean = true;
|
showRecordingButton = input<boolean>(true);
|
||||||
@Input() showViewRecordingsButton: boolean = false;
|
showViewRecordingsButton = input<boolean>(false);
|
||||||
@Input() showBroadcastingButton: boolean = true;
|
showBroadcastingButton = input<boolean>(true);
|
||||||
@Input() showBackgroundEffectsButton: boolean = true;
|
showBackgroundEffectsButton = input<boolean>(true);
|
||||||
@Input() showCaptionsButton: boolean = true;
|
showCaptionsButton = input<boolean>(true);
|
||||||
@Input() showSettingsButton: boolean = true;
|
showSettingsButton = input<boolean>(true);
|
||||||
|
|
||||||
// Fullscreen state
|
// Fullscreen state
|
||||||
@Input() isFullscreenActive: boolean = false;
|
isFullscreenActive = input<boolean>(false);
|
||||||
|
|
||||||
// Recording related inputs
|
// Recording related inputs
|
||||||
@Input() recordingStatus: RecordingStatus = RecordingStatus.STOPPED;
|
recordingStatus = input<RecordingStatus>(RecordingStatus.STOPPED);
|
||||||
@Input() hasRoomTracksPublished: boolean = false;
|
hasRoomTracksPublished = input<boolean>(false);
|
||||||
|
|
||||||
// Broadcasting related inputs
|
// Broadcasting related inputs
|
||||||
@Input() broadcastingStatus: BroadcastingStatus = BroadcastingStatus.STOPPED;
|
broadcastingStatus = input<BroadcastingStatus>(BroadcastingStatus.STOPPED);
|
||||||
|
|
||||||
// Captions
|
// Captions
|
||||||
@Input() captionsEnabled: boolean = false;
|
captionsEnabled = input<boolean>(false);
|
||||||
|
|
||||||
// Leave button
|
// Leave button
|
||||||
@Input() showLeaveButton: boolean = true;
|
showLeaveButton = input<boolean>(true);
|
||||||
|
|
||||||
// Additional buttons template
|
// Additional buttons template
|
||||||
@Input() toolbarAdditionalButtonsTemplate: TemplateRef<any> | null = null;
|
toolbarAdditionalButtonsTemplate = input<TemplateRef<any> | null>(null);
|
||||||
@Input() additionalButtonsPosition: ToolbarAdditionalButtonsPosition | undefined;
|
additionalButtonsPosition = input<ToolbarAdditionalButtonsPosition | undefined>(undefined);
|
||||||
|
|
||||||
// Leave button template
|
// Leave button template
|
||||||
@Input() toolbarLeaveButtonTemplate: TemplateRef<any> | null = null;
|
toolbarLeaveButtonTemplate = input<TemplateRef<any> | null>(null);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
|
|
@ -100,34 +101,34 @@ export class ToolbarMediaButtonsComponent {
|
||||||
readonly isDesktopView = computed(() => this.viewportService.isDesktop());
|
readonly isDesktopView = computed(() => this.viewportService.isDesktop());
|
||||||
|
|
||||||
// Essential buttons that always stay visible
|
// Essential buttons that always stay visible
|
||||||
readonly showCameraButtonDirect = computed(() => this.showCameraButton && !this.isMinimal);
|
readonly showCameraButtonDirect = computed(() => this.showCameraButton() && !this.isMinimal());
|
||||||
|
|
||||||
readonly showMicrophoneButtonDirect = computed(() => this.showMicrophoneButton && !this.isMinimal);
|
readonly showMicrophoneButtonDirect = computed(() => this.showMicrophoneButton() && !this.isMinimal());
|
||||||
|
|
||||||
// Screenshare button - visible on tablet+ or when already active
|
// Screenshare button - visible on tablet+ or when already active
|
||||||
readonly showScreenshareButtonDirect = computed(
|
readonly showScreenshareButtonDirect = computed(
|
||||||
() => this.showScreenshareButton && !this.isMinimal && (!this.isMobileView() || this.isScreenShareEnabled)
|
() => this.showScreenshareButton() && !this.isMinimal() && (!this.isMobileView() || this.isScreenShareEnabled())
|
||||||
);
|
);
|
||||||
|
|
||||||
// More options button - always visible when not minimal
|
// More options button - always visible when not minimal
|
||||||
readonly showMoreOptionsButtonDirect = computed(() => this.showMoreOptionsButton && !this.isMinimal);
|
readonly showMoreOptionsButtonDirect = computed(() => this.showMoreOptionsButton() && !this.isMinimal());
|
||||||
|
|
||||||
// Check if there are active features that should show a badge on More Options
|
// Check if there are active features that should show a badge on More Options
|
||||||
readonly hasActiveFeatures = computed(
|
readonly hasActiveFeatures = computed(
|
||||||
() =>
|
() =>
|
||||||
this.isScreenShareEnabled ||
|
this.isScreenShareEnabled() ||
|
||||||
this.recordingStatus === this._recordingStatus.STARTED ||
|
this.recordingStatus() === this._recordingStatus.STARTED ||
|
||||||
this.broadcastingStatus === this._broadcastingStatus.STARTED
|
this.broadcastingStatus() === this._broadcastingStatus.STARTED
|
||||||
);
|
);
|
||||||
|
|
||||||
// Check if additional buttons should be shown outside (desktop/tablet) or inside More Options (mobile)
|
// Check if additional buttons should be shown outside (desktop/tablet) or inside More Options (mobile)
|
||||||
readonly showAdditionalButtonsOutside = computed(() => {
|
readonly showAdditionalButtonsOutside = computed(() => {
|
||||||
return !this.isMobileView() && this.toolbarAdditionalButtonsTemplate;
|
return !this.isMobileView() && this.toolbarAdditionalButtonsTemplate();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if additional buttons should be shown inside More Options menu (mobile only)
|
// Check if additional buttons should be shown inside More Options menu (mobile only)
|
||||||
readonly showAdditionalButtonsInsideMenu = computed(() => {
|
readonly showAdditionalButtonsInsideMenu = computed(() => {
|
||||||
return this.isMobileView() && this.toolbarAdditionalButtonsTemplate;
|
return this.isMobileView() && this.toolbarAdditionalButtonsTemplate();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Media button outputs
|
// Media button outputs
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@
|
||||||
[microphoneMuteChanging]="microphoneMuteChanging"
|
[microphoneMuteChanging]="microphoneMuteChanging"
|
||||||
[showScreenshareButton]="showScreenshareButton"
|
[showScreenshareButton]="showScreenshareButton"
|
||||||
[isScreenShareEnabled]="isScreenShareEnabled"
|
[isScreenShareEnabled]="isScreenShareEnabled"
|
||||||
|
[isFirefoxBrowser]="isFirefoxBrowser"
|
||||||
[hasVideoDevices]="hasVideoDevices"
|
[hasVideoDevices]="hasVideoDevices"
|
||||||
[hasAudioDevices]="hasAudioDevices"
|
[hasAudioDevices]="hasAudioDevices"
|
||||||
[isConnectionLost]="isConnectionLost"
|
[isConnectionLost]="isConnectionLost"
|
||||||
|
|
|
||||||
|
|
@ -344,6 +344,11 @@ export class ToolbarComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
*/
|
*/
|
||||||
showCaptionsButton: boolean = true;
|
showCaptionsButton: boolean = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
isFirefoxBrowser: boolean = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ignore
|
* @ignore
|
||||||
*/
|
*/
|
||||||
|
|
@ -450,6 +455,7 @@ export class ToolbarComponent implements OnInit, OnDestroy, AfterViewInit {
|
||||||
private templateManagerService: TemplateManagerService
|
private templateManagerService: TemplateManagerService
|
||||||
) {
|
) {
|
||||||
this.log = this.loggerSrv.get('ToolbarComponent');
|
this.log = this.loggerSrv.get('ToolbarComponent');
|
||||||
|
this.isFirefoxBrowser = this.platformService.isFirefox();
|
||||||
|
|
||||||
// Effect to react to local participant changes
|
// Effect to react to local participant changes
|
||||||
effect(() => {
|
effect(() => {
|
||||||
|
|
|
||||||
|
|
@ -436,14 +436,19 @@ export class ParticipantModel {
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
async switchScreenshare(newTrack: LocalTrack): Promise<void> {
|
async switchScreenshare(newTrack: LocalTrack): Promise<void> {
|
||||||
if (this.participant instanceof LocalParticipant) {
|
if (!(this.participant instanceof LocalParticipant)) {
|
||||||
const screenTrack = this.tracks.find((track) => track.source === Track.Source.ScreenShare);
|
|
||||||
if (screenTrack) {
|
|
||||||
await (screenTrack.videoTrack as LocalTrack).replaceTrack(newTrack.mediaStreamTrack);
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
return Promise.reject("Remote participant can't switch screen share");
|
return Promise.reject("Remote participant can't switch screen share");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const screenTrack = this.tracks.find((track) => track.source === Track.Source.ScreenShare);
|
||||||
|
if (!screenTrack || !screenTrack.videoTrack) {
|
||||||
|
return Promise.reject('No active screen share track to switch');
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentTrack = screenTrack.videoTrack as LocalTrack;
|
||||||
|
|
||||||
|
await currentTrack.replaceTrack(newTrack.mediaStreamTrack);
|
||||||
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ export class ParticipantService {
|
||||||
private remoteParticipantsWritableSignal: WritableSignal<ParticipantModel[]> = signal<ParticipantModel[]>([]);
|
private remoteParticipantsWritableSignal: WritableSignal<ParticipantModel[]> = signal<ParticipantModel[]>([]);
|
||||||
|
|
||||||
private localParticipant: ParticipantModel | undefined;
|
private localParticipant: ParticipantModel | undefined;
|
||||||
|
private lastLocalParticipantSnapshot: ParticipantModel | undefined;
|
||||||
private remoteParticipants: ParticipantModel[] = [];
|
private remoteParticipants: ParticipantModel[] = [];
|
||||||
private log: ILogger;
|
private log: ILogger;
|
||||||
|
|
||||||
|
|
@ -85,6 +86,7 @@ export class ParticipantService {
|
||||||
*/
|
*/
|
||||||
clear(): void {
|
clear(): void {
|
||||||
this.localParticipant = undefined;
|
this.localParticipant = undefined;
|
||||||
|
this.lastLocalParticipantSnapshot = undefined;
|
||||||
this.remoteParticipants = [];
|
this.remoteParticipants = [];
|
||||||
this.localParticipantWritableSignal.set(undefined);
|
this.localParticipantWritableSignal.set(undefined);
|
||||||
this.remoteParticipantsWritableSignal.set([]);
|
this.remoteParticipantsWritableSignal.set([]);
|
||||||
|
|
@ -189,19 +191,26 @@ export class ParticipantService {
|
||||||
* Switches the active screen share track showing a native browser dialog to select a screen or window.
|
* Switches the active screen share track showing a native browser dialog to select a screen or window.
|
||||||
*/
|
*/
|
||||||
async switchScreenShare(): Promise<void> {
|
async switchScreenShare(): Promise<void> {
|
||||||
if (this.localParticipant) {
|
if (!this.localParticipant) {
|
||||||
|
this.log.e('Local participant is undefined when switching screenshare');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chrome / Safari: seamless replaceTrack keeps the same publication SID.
|
||||||
const options = this.getScreenCaptureOptions();
|
const options = this.getScreenCaptureOptions();
|
||||||
const [newTrack] = await this.localParticipant.createScreenTracks(options);
|
const [newTrack] = await this.localParticipant.createScreenTracks(options);
|
||||||
if (newTrack) {
|
if (newTrack) {
|
||||||
newTrack?.addListener('ended', async () => {
|
newTrack.addListener('ended', async () => {
|
||||||
this.log.d('Clicked native stop button. Stopping screen sharing');
|
this.log.d('Clicked native stop button. Stopping screen sharing');
|
||||||
await this.setScreenShareEnabled(false);
|
await this.setScreenShareEnabled(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
await this.localParticipant.switchScreenshare(newTrack);
|
await this.localParticipant.switchScreenshare(newTrack);
|
||||||
|
} catch (error) {
|
||||||
|
newTrack.stop();
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.log.e('Local participant is undefined when switching screenshare');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// this.updateLocalParticipant();
|
// this.updateLocalParticipant();
|
||||||
|
|
@ -403,18 +412,55 @@ export class ParticipantService {
|
||||||
* Forces to update the local participant object and fire a new `localParticipant$` Observable event.
|
* Forces to update the local participant object and fire a new `localParticipant$` Observable event.
|
||||||
*/
|
*/
|
||||||
updateLocalParticipant() {
|
updateLocalParticipant() {
|
||||||
|
const localParticipantFromSignal = this.localParticipantWritableSignal();
|
||||||
|
|
||||||
|
// Backward compatibility: if the consumer mutated the last emitted snapshot and
|
||||||
|
// then calls updateLocalParticipant(), keep the internal source of truth in sync.
|
||||||
|
// Only sync when the emitted snapshot actually diverged after emission; otherwise,
|
||||||
|
// a stale observable/signal snapshot would overwrite newer canonical state.
|
||||||
|
if (
|
||||||
|
this.localParticipant &&
|
||||||
|
localParticipantFromSignal &&
|
||||||
|
this.lastLocalParticipantSnapshot &&
|
||||||
|
localParticipantFromSignal !== this.localParticipant &&
|
||||||
|
localParticipantFromSignal.sid === this.localParticipant.sid &&
|
||||||
|
this.hasParticipantSnapshotMutations(localParticipantFromSignal, this.lastLocalParticipantSnapshot)
|
||||||
|
) {
|
||||||
|
Object.assign(this.localParticipant, localParticipantFromSignal);
|
||||||
|
}
|
||||||
|
|
||||||
// Update Signal - create new reference to trigger reactivity
|
// Update Signal - create new reference to trigger reactivity
|
||||||
// The Observable will automatically emit via toObservable()
|
// The Observable will automatically emit via toObservable()
|
||||||
if (this.localParticipant) {
|
if (this.localParticipant) {
|
||||||
const updatedParticipant = Object.assign(Object.create(Object.getPrototypeOf(this.localParticipant)), {
|
const updatedParticipant = this.cloneParticipant(this.localParticipant);
|
||||||
...this.localParticipant
|
|
||||||
});
|
|
||||||
this.localParticipantWritableSignal.set(updatedParticipant);
|
this.localParticipantWritableSignal.set(updatedParticipant);
|
||||||
|
this.lastLocalParticipantSnapshot = this.cloneParticipant(updatedParticipant);
|
||||||
} else {
|
} else {
|
||||||
this.localParticipantWritableSignal.set(undefined);
|
this.localParticipantWritableSignal.set(undefined);
|
||||||
|
this.lastLocalParticipantSnapshot = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private hasParticipantSnapshotMutations(current: ParticipantModel, previous: ParticipantModel): boolean {
|
||||||
|
const currentState = current as unknown as Record<string, unknown>;
|
||||||
|
const previousState = previous as unknown as Record<string, unknown>;
|
||||||
|
const keys = new Set([...Object.keys(currentState), ...Object.keys(previousState)]);
|
||||||
|
|
||||||
|
for (const key of keys) {
|
||||||
|
if (!Object.is(currentState[key], previousState[key])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private cloneParticipant<T extends ParticipantModel>(participant: T): T {
|
||||||
|
return Object.assign(Object.create(Object.getPrototypeOf(participant)), {
|
||||||
|
...participant
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the last screen element as pinned
|
* Sets the last screen element as pinned
|
||||||
* @internal
|
* @internal
|
||||||
|
|
@ -459,7 +505,6 @@ export class ParticipantService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the participant with the given identity.
|
* Returns the participant with the given identity.
|
||||||
* @param identity
|
* @param identity
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
services:
|
services:
|
||||||
|
|
||||||
caddy-proxy:
|
caddy-proxy:
|
||||||
image: docker.io/openvidu/openvidu-caddy-local:3.6.0
|
image: docker.io/openvidu/openvidu-caddy-local:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -49,7 +49,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
image: docker.io/openvidu/minio:2025.10.15-debian-12-r9
|
image: docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- 9000:9000
|
- 9000:9000
|
||||||
|
|
@ -69,7 +69,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
image: docker.io/openvidu/mongodb:8.0.19-r1
|
image: docker.io/openvidu/mongodb:8.0.19-r2
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- 27017:27017
|
- 27017:27017
|
||||||
|
|
@ -88,7 +88,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
dashboard:
|
dashboard:
|
||||||
image: docker.io/openvidu/openvidu-dashboard:3.6.0
|
image: docker.io/openvidu/openvidu-dashboard:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- SERVER_PORT=5000
|
- SERVER_PORT=5000
|
||||||
|
|
@ -102,7 +102,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu:
|
openvidu:
|
||||||
image: docker.io/openvidu/openvidu-server:3.6.0
|
image: docker.io/openvidu/openvidu-server:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -123,7 +123,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
image: docker.io/openvidu/ingress:3.6.0
|
image: docker.io/openvidu/ingress:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -141,7 +141,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
egress:
|
egress:
|
||||||
image: docker.io/openvidu/egress:3.6.0
|
image: docker.io/openvidu/egress:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -156,7 +156,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
operator:
|
operator:
|
||||||
image: docker.io/openvidu/openvidu-operator:3.6.0
|
image: docker.io/openvidu/openvidu-operator:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
|
@ -179,7 +179,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu-meet:
|
openvidu-meet:
|
||||||
image: docker.io/openvidu/openvidu-meet:3.6.0
|
image: docker.io/openvidu/openvidu-meet:main
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -219,7 +219,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu-meet-init:
|
openvidu-meet-init:
|
||||||
image: docker.io/openvidu/openvidu-operator:3.6.0
|
image: docker.io/openvidu/openvidu-operator:main
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
environment:
|
environment:
|
||||||
- MODE=local-ready-check
|
- MODE=local-ready-check
|
||||||
|
|
|
||||||
|
|
@ -680,7 +680,7 @@ Resources:
|
||||||
'/usr/local/bin/install.sh':
|
'/usr/local/bin/install.sh':
|
||||||
content: !Sub |
|
content: !Sub |
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ var stringInterpolationParams = {
|
||||||
|
|
||||||
var installScriptTemplate = '''
|
var installScriptTemplate = '''
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
|
|
||||||
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -148,7 +148,7 @@ locals {
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -1441,7 +1441,7 @@ Resources:
|
||||||
content: !Sub |
|
content: !Sub |
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
|
|
||||||
|
|
@ -2496,6 +2496,15 @@ Resources:
|
||||||
ToPort: 9080
|
ToPort: 9080
|
||||||
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
||||||
|
|
||||||
|
OpenViduMediaNodeToMasterCustomAppIngress:
|
||||||
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
|
Properties:
|
||||||
|
GroupId: !GetAtt OpenViduMasterNodeSG.GroupId
|
||||||
|
IpProtocol: tcp
|
||||||
|
FromPort: 6080
|
||||||
|
ToPort: 6080
|
||||||
|
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
||||||
|
|
||||||
OpenViduMediaNodeSG:
|
OpenViduMediaNodeSG:
|
||||||
Type: AWS::EC2::SecurityGroup
|
Type: AWS::EC2::SecurityGroup
|
||||||
Properties:
|
Properties:
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,7 @@ var stringInterpolationParamsMaster = {
|
||||||
|
|
||||||
var installScriptTemplateMaster = '''
|
var installScriptTemplateMaster = '''
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
|
|
||||||
# Assume azure cli is installed
|
# Assume azure cli is installed
|
||||||
|
|
@ -1708,6 +1708,29 @@ resource mediaToMasterMeetWebhookIngress 'Microsoft.Network/networkSecurityGroup
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource mediaToMasterCustomAppWebhookIngress 'Microsoft.Network/networkSecurityGroups/securityRules@2023-11-01' = {
|
||||||
|
parent: openviduMasterNodeNSG
|
||||||
|
name: 'mediaNode_to_masterNode_CUSTOM_APP_WEBHOOK_INGRESS'
|
||||||
|
properties: {
|
||||||
|
protocol: 'Tcp'
|
||||||
|
sourceApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMediaNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
sourcePortRange: '*'
|
||||||
|
destinationApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMasterNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
destinationPortRange: '6080'
|
||||||
|
access: 'Allow'
|
||||||
|
priority: 220
|
||||||
|
direction: 'Inbound'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resource openviduMediaNodeNSG 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
|
resource openviduMediaNodeNSG 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
|
||||||
name: '${stackName}-mediaNoderNSG'
|
name: '${stackName}-mediaNoderNSG'
|
||||||
location: location
|
location: location
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -87,7 +87,7 @@ resource "google_compute_firewall" "firewall_media_to_master" {
|
||||||
|
|
||||||
allow {
|
allow {
|
||||||
protocol = "tcp"
|
protocol = "tcp"
|
||||||
ports = ["7000", "9100", "20000", "3100", "9009", "4443", "9080"]
|
ports = ["7000", "9100", "20000", "3100", "9009", "4443", "9080", "6080"]
|
||||||
}
|
}
|
||||||
|
|
||||||
source_tags = [
|
source_tags = [
|
||||||
|
|
@ -617,7 +617,7 @@ locals {
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -1544,7 +1544,7 @@ Resources:
|
||||||
content: !Sub |
|
content: !Sub |
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
|
|
||||||
|
|
@ -2918,6 +2918,15 @@ Resources:
|
||||||
ToPort: 9080
|
ToPort: 9080
|
||||||
SourceSecurityGroupId: !Ref OpenViduMasterNodeSG
|
SourceSecurityGroupId: !Ref OpenViduMasterNodeSG
|
||||||
|
|
||||||
|
OpenViduMasterToMasterCustomAppIngress:
|
||||||
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
|
Properties:
|
||||||
|
GroupId: !Ref OpenViduMasterNodeSG
|
||||||
|
IpProtocol: tcp
|
||||||
|
FromPort: 6080
|
||||||
|
ToPort: 6080
|
||||||
|
SourceSecurityGroupId: !Ref OpenViduMasterNodeSG
|
||||||
|
|
||||||
OpenViduMediaNodeToMasterMeetWebhookIngress:
|
OpenViduMediaNodeToMasterMeetWebhookIngress:
|
||||||
Type: AWS::EC2::SecurityGroupIngress
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
Properties:
|
Properties:
|
||||||
|
|
@ -2927,6 +2936,15 @@ Resources:
|
||||||
ToPort: 9080
|
ToPort: 9080
|
||||||
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
||||||
|
|
||||||
|
OpenViduMediaNodeToMasterCustomAppIngress:
|
||||||
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
|
Properties:
|
||||||
|
GroupId: !GetAtt OpenViduMasterNodeSG.GroupId
|
||||||
|
IpProtocol: tcp
|
||||||
|
FromPort: 6080
|
||||||
|
ToPort: 6080
|
||||||
|
SourceSecurityGroupId: !GetAtt OpenViduMediaNodeSG.GroupId
|
||||||
|
|
||||||
OpenViduMediaNodeSG:
|
OpenViduMediaNodeSG:
|
||||||
Type: AWS::EC2::SecurityGroup
|
Type: AWS::EC2::SecurityGroup
|
||||||
Properties:
|
Properties:
|
||||||
|
|
@ -3094,7 +3112,7 @@ Resources:
|
||||||
Properties:
|
Properties:
|
||||||
DefaultActions:
|
DefaultActions:
|
||||||
- Type: forward
|
- Type: forward
|
||||||
TargetGroupArn: !Ref OpenViduMasterNodeWithTurnTLSTG
|
TargetGroupArn: !Ref OpenViduMasterNodeHTTPTG
|
||||||
LoadBalancerArn: !Ref LoadBalancer
|
LoadBalancerArn: !Ref LoadBalancer
|
||||||
Port: 80
|
Port: 80
|
||||||
Protocol: TCP
|
Protocol: TCP
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@ var stringInterpolationParamsMaster4 = {
|
||||||
var installScriptTemplateMaster = '''
|
var installScriptTemplateMaster = '''
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
|
|
||||||
# Assume azure cli is installed
|
# Assume azure cli is installed
|
||||||
|
|
@ -2591,6 +2591,29 @@ resource masterToMasterMeet 'Microsoft.Network/networkSecurityGroups/securityRul
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource masterToMasterCustomApp 'Microsoft.Network/networkSecurityGroups/securityRules@2023-11-01' = {
|
||||||
|
parent: openviduMasterNodeNSG
|
||||||
|
name: 'masterNode_to_masterNode_CUSTOM_APP_INGRESS'
|
||||||
|
properties: {
|
||||||
|
protocol: 'Tcp'
|
||||||
|
sourceApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMasterNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
sourcePortRange: '*'
|
||||||
|
destinationApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMasterNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
destinationPortRange: '6080'
|
||||||
|
access: 'Allow'
|
||||||
|
priority: 310
|
||||||
|
direction: 'Inbound'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resource mediaToMasterMeetWebhookIngress 'Microsoft.Network/networkSecurityGroups/securityRules@2023-11-01' = {
|
resource mediaToMasterMeetWebhookIngress 'Microsoft.Network/networkSecurityGroups/securityRules@2023-11-01' = {
|
||||||
parent: openviduMasterNodeNSG
|
parent: openviduMasterNodeNSG
|
||||||
name: 'mediaNode_to_masterNode_MEET_WEBHOOK_INGRESS'
|
name: 'mediaNode_to_masterNode_MEET_WEBHOOK_INGRESS'
|
||||||
|
|
@ -2614,6 +2637,29 @@ resource mediaToMasterMeetWebhookIngress 'Microsoft.Network/networkSecurityGroup
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource mediaToMasterCustomAppWebhookIngress 'Microsoft.Network/networkSecurityGroups/securityRules@2023-11-01' = {
|
||||||
|
parent: openviduMasterNodeNSG
|
||||||
|
name: 'mediaNode_to_masterNode_CUSTOM_APP_WEBHOOK_INGRESS'
|
||||||
|
properties: {
|
||||||
|
protocol: 'Tcp'
|
||||||
|
sourceApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMediaNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
sourcePortRange: '*'
|
||||||
|
destinationApplicationSecurityGroups: [
|
||||||
|
{
|
||||||
|
id: openviduMasterNodeASG.id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
destinationPortRange: '6080'
|
||||||
|
access: 'Allow'
|
||||||
|
priority: 320
|
||||||
|
direction: 'Inbound'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resource openviduMediaNodeNSG 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
|
resource openviduMediaNodeNSG 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
|
||||||
name: '${stackName}-mediaNodeNSG'
|
name: '${stackName}-mediaNodeNSG'
|
||||||
location: location
|
location: location
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -122,7 +122,8 @@ resource "google_compute_firewall" "master_to_master_internal" {
|
||||||
"5000",
|
"5000",
|
||||||
"3000",
|
"3000",
|
||||||
"4443",
|
"4443",
|
||||||
"9080"
|
"9080",
|
||||||
|
"6080"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,7 +146,8 @@ resource "google_compute_firewall" "media_to_master_services" {
|
||||||
"9009",
|
"9009",
|
||||||
"3100",
|
"3100",
|
||||||
"4443",
|
"4443",
|
||||||
"9080"
|
"9080",
|
||||||
|
"6080"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -940,7 +942,7 @@ locals {
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
services:
|
services:
|
||||||
caddy-proxy:
|
caddy-proxy:
|
||||||
image: docker.io/openvidu/openvidu-caddy-local:3.6.0
|
image: docker.io/openvidu/openvidu-caddy-local:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -49,7 +49,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
image: docker.io/openvidu/minio:2025.10.15-debian-12-r9
|
image: docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- 9000:9000
|
- 9000:9000
|
||||||
|
|
@ -69,7 +69,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
image: docker.io/openvidu/mongodb:8.0.19-r1
|
image: docker.io/openvidu/mongodb:8.0.19-r2
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- 27017:27017
|
- 27017:27017
|
||||||
|
|
@ -88,7 +88,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
dashboard:
|
dashboard:
|
||||||
image: docker.io/openvidu/openvidu-dashboard:3.6.0
|
image: docker.io/openvidu/openvidu-dashboard:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
|
@ -102,7 +102,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu:
|
openvidu:
|
||||||
image: docker.io/openvidu/openvidu-server-pro:3.6.0
|
image: docker.io/openvidu/openvidu-server-pro:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -125,7 +125,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
image: docker.io/openvidu/ingress:3.6.0
|
image: docker.io/openvidu/ingress:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -143,7 +143,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
egress:
|
egress:
|
||||||
image: docker.io/openvidu/egress:3.6.0
|
image: docker.io/openvidu/egress:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -157,7 +157,7 @@ services:
|
||||||
setup:
|
setup:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
operator:
|
operator:
|
||||||
image: docker.io/openvidu/openvidu-operator:3.6.0
|
image: docker.io/openvidu/openvidu-operator:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
|
@ -181,7 +181,7 @@ services:
|
||||||
|
|
||||||
|
|
||||||
openvidu-meet:
|
openvidu-meet:
|
||||||
image: docker.io/openvidu/openvidu-meet:3.6.0
|
image: docker.io/openvidu/openvidu-meet:main
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- host.docker.internal:host-gateway
|
- host.docker.internal:host-gateway
|
||||||
|
|
@ -221,7 +221,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu-v2compatibility:
|
openvidu-v2compatibility:
|
||||||
image: docker.io/openvidu/openvidu-v2compatibility:3.6.0
|
image: docker.io/openvidu/openvidu-v2compatibility:main
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: /bin/sh /scripts/entrypoint_openvidu_v2_compat.sh
|
entrypoint: /bin/sh /scripts/entrypoint_openvidu_v2_compat.sh
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
|
|
@ -258,7 +258,7 @@ services:
|
||||||
condition: service_completed_successfully
|
condition: service_completed_successfully
|
||||||
|
|
||||||
openvidu-meet-init:
|
openvidu-meet-init:
|
||||||
image: docker.io/openvidu/openvidu-operator:3.6.0
|
image: docker.io/openvidu/openvidu-operator:main
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
environment:
|
environment:
|
||||||
- MODE=local-ready-check
|
- MODE=local-ready-check
|
||||||
|
|
|
||||||
|
|
@ -782,7 +782,7 @@ Resources:
|
||||||
'/usr/local/bin/install.sh':
|
'/usr/local/bin/install.sh':
|
||||||
content: !Sub |
|
content: !Sub |
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ var stringInterpolationParams = {
|
||||||
|
|
||||||
var installScriptTemplate = '''
|
var installScriptTemplate = '''
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
|
|
||||||
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -148,7 +148,7 @@ locals {
|
||||||
#!/bin/bash -x
|
#!/bin/bash -x
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
OPENVIDU_VERSION=3.6.0
|
OPENVIDU_VERSION=main
|
||||||
DOMAIN=
|
DOMAIN=
|
||||||
YQ_VERSION=v4.52.4
|
YQ_VERSION=v4.52.4
|
||||||
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
echo "DPkg::Lock::Timeout \"-1\";" > /etc/apt/apt.conf.d/99timeout
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@
|
||||||
set -eu
|
set -eu
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
export INSTALLER_IMAGE="${INSTALLER_IMAGE:-docker.io/openvidu/openvidu-installer:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
# Function to compare two version strings
|
# Function to compare two version strings
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@ set -eu
|
||||||
export INSTALL_PREFIX="${INSTALL_PREFIX:-/opt/openvidu}"
|
export INSTALL_PREFIX="${INSTALL_PREFIX:-/opt/openvidu}"
|
||||||
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
export DOCKER_VERSION="${DOCKER_VERSION:-29.2.1}"
|
||||||
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v5.0.2}"
|
||||||
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-3.6.0}"
|
export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}"
|
||||||
export UPDATER_IMAGE="${UPDATER_IMAGE:-docker.io/openvidu/openvidu-updater:${OPENVIDU_VERSION}}"
|
export UPDATER_IMAGE="${UPDATER_IMAGE:-docker.io/openvidu/openvidu-updater:${OPENVIDU_VERSION}}"
|
||||||
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:2025.10.15-debian-12-r9}"
|
export MINIO_SERVER_IMAGE="${MINIO_SERVER_IMAGE:-docker.io/openvidu/minio:RELEASE.2026-03-04T16-04-53Z-r0}"
|
||||||
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:2025.8.13-debian-12-r12}"
|
export MINIO_CLIENT_IMAGE="${MINIO_CLIENT_IMAGE:-docker.io/openvidu/minio-client:RELEASE.2026-03-12T12-23-10Z}"
|
||||||
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
export MONGO_SERVER_IMAGE="${MONGO_SERVER_IMAGE:-docker.io/mongo:8.0.19}"
|
||||||
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
export REDIS_SERVER_IMAGE="${REDIS_SERVER_IMAGE:-docker.io/redis:8.6.1-alpine}"
|
||||||
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
export BUSYBOX_IMAGE="${BUSYBOX_IMAGE:-docker.io/busybox:1.37.0}"
|
||||||
|
|
@ -26,7 +26,7 @@ export LIVEKIT_EGRESS_SERVER_IMAGE="${LIVEKIT_EGRESS_SERVER_IMAGE:-docker.io/ope
|
||||||
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
export PROMETHEUS_IMAGE="${PROMETHEUS_IMAGE:-docker.io/prom/prometheus:v3.9.1}"
|
||||||
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
export PROMTAIL_IMAGE="${PROMTAIL_IMAGE:-docker.io/grafana/promtail:3.5.11}"
|
||||||
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
export LOKI_IMAGE="${LOKI_IMAGE:-docker.io/grafana/loki:3.5.11}"
|
||||||
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.3}"
|
export MIMIR_IMAGE="${MIMIR_IMAGE:-docker.io/openvidu/grafana-mimir:3.0.4-r0}"
|
||||||
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
export GRAFANA_IMAGE="${GRAFANA_IMAGE:-docker.io/grafana/grafana:12.3.4}"
|
||||||
|
|
||||||
get_next_version() {
|
get_next_version() {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ import javax.net.ssl.TrustManager;
|
||||||
import javax.net.ssl.X509TrustManager;
|
import javax.net.ssl.X509TrustManager;
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.apache.commons.lang3.tuple.Triple;
|
import org.apache.commons.lang3.tuple.Triple;
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
|
@ -60,16 +59,20 @@ public class OpenViduTestE2e {
|
||||||
// Value is a pair with:
|
// Value is a pair with:
|
||||||
// 1. The flag value of the ffmpeg command
|
// 1. The flag value of the ffmpeg command
|
||||||
// 2. Any extra flags needed for that codec to work
|
// 2. Any extra flags needed for that codec to work
|
||||||
final protected static Map<String, Pair<String, ?>> FFMPEG_VIDEO_CODEC_NAMES = new HashMap<>() {
|
// Key is the common name of the video codec. Value is a triple with:
|
||||||
|
// 1. The flag value of the ffmpeg command
|
||||||
|
// 2. Any extra flags needed for that codec to work
|
||||||
|
// 3. The string expected to appear on the server log when the stream starts
|
||||||
|
final protected static Map<String, Triple<String, String, String>> FFMPEG_VIDEO_CODEC_NAMES = new HashMap<>() {
|
||||||
{
|
{
|
||||||
put("H264", Pair.of("libx264", ""));
|
put("H264", Triple.of("libx264", "", "H264"));
|
||||||
put("VP8", Pair.of("libvpx", ""));
|
put("VP8", Triple.of("libvpx", "", "VP8"));
|
||||||
put("VP9", Pair.of("libvpx-vp9", ""));
|
put("VP9", Triple.of("libvpx-vp9", "", "VP9"));
|
||||||
put("MPEG-4", Pair.of("mpeg4", ""));
|
put("MPEG-4", Triple.of("mpeg4", "", "MPEG-4"));
|
||||||
put("M-JPEG", Pair.of("mjpeg", "-force_duplicated_matrix:v 1 -huffman:v 0"));
|
put("M-JPEG", Triple.of("mjpeg", "-force_duplicated_matrix:v 1 -huffman:v 0", "MJPEG"));
|
||||||
// put("AV1", Pair.of("libaom-av1", "")); // NOT SUPPORTED BY THE RTSP SERVER
|
// put("AV1", Triple.of("libaom-av1", "", "AV1")); // NOT SUPPORTED BY THE RTSP SERVER
|
||||||
// (maybe gstreamer?)
|
// (maybe gstreamer?)
|
||||||
// put("H265", Pair.of("libx265", "")); // NOT SUPPORTED BY INGRESS
|
// put("H265", Triple.of("libx265", "", "H265")); // NOT SUPPORTED BY INGRESS
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -84,7 +87,7 @@ public class OpenViduTestE2e {
|
||||||
put("AAC", Triple.of("aac", "-ac 2 -b:a 128k", "MPEG-4 Audio"));
|
put("AAC", Triple.of("aac", "-ac 2 -b:a 128k", "MPEG-4 Audio"));
|
||||||
put("AC3", Triple.of("ac3", "-b:a 128k", null));
|
put("AC3", Triple.of("ac3", "-b:a 128k", null));
|
||||||
put("OPUS", Triple.of("libopus", "-ac 2", "Opus"));
|
put("OPUS", Triple.of("libopus", "-ac 2", "Opus"));
|
||||||
put("MP3", Triple.of("libmp3lame", "", "MPEG-1/2 Audio"));
|
put("MP3", Triple.of("libmp3lame", "", "MPEG-1 Audio"));
|
||||||
put("VORBIS", Triple.of("libvorbis", "", null));
|
put("VORBIS", Triple.of("libvorbis", "", null));
|
||||||
put("G711", Triple.of("pcm_mulaw", "", "G711"));
|
put("G711", Triple.of("pcm_mulaw", "", "G711"));
|
||||||
}
|
}
|
||||||
|
|
@ -222,7 +225,8 @@ public class OpenViduTestE2e {
|
||||||
|
|
||||||
// e.g. "[path live] stream is available and online, 2 tracks (H264, Opus)"
|
// e.g. "[path live] stream is available and online, 2 tracks (H264, Opus)"
|
||||||
if (videoCodec != null) {
|
if (videoCodec != null) {
|
||||||
String regex = ".*\\[path " + RTSP_PATH + "\\] stream is available.*\\(.*(?i)(" + videoCodec + ").*\\).*";
|
String expectedVideoCodecLogValue = FFMPEG_VIDEO_CODEC_NAMES.get(videoCodec).getRight();
|
||||||
|
String regex = ".*\\[path " + RTSP_PATH + "\\] stream is available.*\\(.*(?i)(" + expectedVideoCodecLogValue + ").*\\).*";
|
||||||
waitUntilLog(rtspServerContainer, regex, 15);
|
waitUntilLog(rtspServerContainer, regex, 15);
|
||||||
}
|
}
|
||||||
if (audioCodec != null) {
|
if (audioCodec != null) {
|
||||||
|
|
@ -289,7 +293,7 @@ public class OpenViduTestE2e {
|
||||||
if (videoCodec != null) {
|
if (videoCodec != null) {
|
||||||
String ffmpegVideoCodecFlag = FFMPEG_VIDEO_CODEC_NAMES.get(videoCodec).getLeft();
|
String ffmpegVideoCodecFlag = FFMPEG_VIDEO_CODEC_NAMES.get(videoCodec).getLeft();
|
||||||
codecs += " -vcodec " + ffmpegVideoCodecFlag + " ";
|
codecs += " -vcodec " + ffmpegVideoCodecFlag + " ";
|
||||||
codecs += FFMPEG_VIDEO_CODEC_NAMES.get(videoCodec).getRight() + " ";
|
codecs += FFMPEG_VIDEO_CODEC_NAMES.get(videoCodec).getMiddle() + " ";
|
||||||
}
|
}
|
||||||
if (audioCodec != null) {
|
if (audioCodec != null) {
|
||||||
String ffmpegAudioCodecFlag = FFMPEG_AUDIO_CODEC_NAMES.get(audioCodec).getLeft();
|
String ffmpegAudioCodecFlag = FFMPEG_AUDIO_CODEC_NAMES.get(audioCodec).getLeft();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue