feat: enhance time synchronization and Jitsi configuration handling

- Implemented a comprehensive time synchronization mechanism that applies GMT offsets based on user configuration, ensuring accurate timestamps across the application.
- Updated the Jitsi configuration to include SSH settings, allowing for better integration with Docker setups.
- Refactored the backend queries and mutations to handle the new SSH configuration fields, ensuring secure and flexible server management.
- Enhanced error handling and logging for time synchronization processes, providing clearer feedback for users and developers.
This commit is contained in:
2025-11-22 18:18:16 -03:00
parent 54089f5eca
commit c056506ce5
17 changed files with 1765 additions and 257 deletions

View File

@@ -172,82 +172,17 @@
}
// Carregar Jitsi dinamicamente
// Polyfill para BlobBuilder (API antiga que lib-jitsi-meet pode usar)
// Deve ser executado antes de qualquer import da biblioteca
function adicionarBlobBuilderPolyfill(): void {
if (!browser || typeof window === 'undefined') return;
// Verificar se já foi adicionado (evitar múltiplas execuções)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if ((window as any).__blobBuilderPolyfillAdded) {
return;
}
// Implementar BlobBuilder usando Blob moderno
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const BlobBuilderClass = class BlobBuilder {
private parts: BlobPart[] = [];
append(data: BlobPart): void {
this.parts.push(data);
}
getBlob(contentType?: string): Blob {
return new Blob(this.parts, contentType ? { type: contentType } : undefined);
}
};
// Adicionar em todos os possíveis locais onde a biblioteca pode procurar
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const win = window as any;
if (typeof win.BlobBuilder === 'undefined') {
win.BlobBuilder = BlobBuilderClass;
}
if (typeof win.WebKitBlobBuilder === 'undefined') {
win.WebKitBlobBuilder = BlobBuilderClass;
}
if (typeof win.MozBlobBuilder === 'undefined') {
win.MozBlobBuilder = BlobBuilderClass;
}
if (typeof win.MSBlobBuilder === 'undefined') {
win.MSBlobBuilder = BlobBuilderClass;
}
// Também adicionar no global scope caso a biblioteca procure lá
if (typeof globalThis !== 'undefined') {
if (typeof (globalThis as any).BlobBuilder === 'undefined') {
(globalThis as any).BlobBuilder = BlobBuilderClass;
}
if (typeof (globalThis as any).WebKitBlobBuilder === 'undefined') {
(globalThis as any).WebKitBlobBuilder = BlobBuilderClass;
}
}
// Marcar que o polyfill foi adicionado
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).__blobBuilderPolyfillAdded = true;
console.log('✅ Polyfill BlobBuilder adicionado para todos os navegadores');
}
// Executar polyfill imediatamente se estiver no browser
// Isso garante que esteja disponível antes de qualquer import
if (browser && typeof window !== 'undefined') {
adicionarBlobBuilderPolyfill();
}
async function carregarJitsi(): Promise<void> {
if (!browser || JitsiMeetJS) return;
try {
console.log('🔄 Tentando carregar lib-jitsi-meet...');
// Adicionar polyfill antes de carregar a biblioteca
adicionarBlobBuilderPolyfill();
// Polyfill BlobBuilder já deve estar disponível via app.html
// Verificar se está disponível antes de carregar a biblioteca
if (typeof (window as any).BlobBuilder === 'undefined') {
console.warn('⚠️ Polyfill BlobBuilder não encontrado, pode causar erros');
}
// Tentar carregar o módulo lib-jitsi-meet dinamicamente
// Usar import dinâmico para evitar problemas de SSR e permitir carregamento apenas no browser
@@ -1000,9 +935,11 @@
onMount(async () => {
if (!browser) return;
// Adicionar polyfill BlobBuilder o mais cedo possível
// Isso deve ser feito antes de qualquer tentativa de carregar lib-jitsi-meet
adicionarBlobBuilderPolyfill();
// Polyfill BlobBuilder já deve estar disponível via app.html
// Verificar se está disponível
if (typeof (window as any).BlobBuilder === 'undefined') {
console.warn('⚠️ Polyfill BlobBuilder não encontrado no onMount');
}
// Inicializar store primeiro
inicializarStore();