vlibras-player-webjs
Version:
Biblioteca JavaScript moderna para integração do VLibras Player com React, Vue, Angular e vanilla JS
178 lines • 5.32 kB
JavaScript
/**
* Sistema de eventos padronizado e type-safe para VLibras Player
* Fornece eventos detalhados sobre o ciclo de vida do player
*/
/**
* Event Emitter type-safe para VLibras
*/
export class VLibrasEventEmitter {
constructor() {
this.listeners = new Map();
this.onceListeners = new Map();
}
/**
* Adiciona um listener para um evento específico
*/
on(event, listener) {
if (!this.listeners.has(event)) {
this.listeners.set(event, []);
}
this.listeners.get(event).push(listener);
// Retorna função para remover o listener
return () => this.off(event, listener);
}
/**
* Adiciona um listener que será executado apenas uma vez
*/
once(event, listener) {
if (!this.onceListeners.has(event)) {
this.onceListeners.set(event, []);
}
this.onceListeners.get(event).push(listener);
return () => this.off(event, listener);
}
/**
* Remove um listener específico
*/
off(event, listener) {
// Remove from regular listeners
const regularListeners = this.listeners.get(event);
if (regularListeners) {
const index = regularListeners.indexOf(listener);
if (index !== -1) {
regularListeners.splice(index, 1);
}
}
// Remove from once listeners
const onceListeners = this.onceListeners.get(event);
if (onceListeners) {
const index = onceListeners.indexOf(listener);
if (index !== -1) {
onceListeners.splice(index, 1);
}
}
}
/**
* Emite um evento para todos os listeners
*/
emit(event, data) {
// Emit to regular listeners
const regularListeners = this.listeners.get(event);
if (regularListeners) {
regularListeners.forEach(listener => {
try {
listener(data);
}
catch (error) {
console.error(`Erro no listener do evento ${event}:`, error);
}
});
}
// Emit to once listeners and remove them
const onceListeners = this.onceListeners.get(event);
if (onceListeners) {
onceListeners.forEach(listener => {
try {
listener(data);
}
catch (error) {
console.error(`Erro no listener once do evento ${event}:`, error);
}
});
this.onceListeners.set(event, []); // Clear once listeners
}
}
/**
* Remove todos os listeners de um evento ou de todos os eventos
*/
removeAllListeners(event) {
if (event) {
this.listeners.delete(event);
this.onceListeners.delete(event);
}
else {
this.listeners.clear();
this.onceListeners.clear();
}
}
/**
* Retorna o número de listeners para um evento
*/
listenerCount(event) {
const regular = this.listeners.get(event)?.length || 0;
const once = this.onceListeners.get(event)?.length || 0;
return regular + once;
}
/**
* Retorna todos os eventos que têm listeners
*/
eventNames() {
const events = new Set();
for (const event of this.listeners.keys()) {
events.add(event);
}
for (const event of this.onceListeners.keys()) {
events.add(event);
}
return Array.from(events);
}
}
/**
* Utilitários para eventos
*/
export class VLibrasEventUtils {
/**
* Cria um timestamp padronizado
*/
static createTimestamp() {
return Date.now();
}
/**
* Aguarda por um evento específico
*/
static waitForEvent(emitter, event, timeout = 5000) {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error(`Timeout aguardando evento ${event}`));
}, timeout);
const cleanup = emitter.once(event, (data) => {
clearTimeout(timer);
resolve(data);
});
// Se o timeout acontecer, remove o listener
setTimeout(() => {
if (timer) {
cleanup();
}
}, timeout);
});
}
/**
* Debounce para eventos frequentes
*/
static debounceEvent(emitter, event, callback, delay = 300) {
let timeoutId = null;
let lastData = null;
const cleanup = emitter.on(event, (data) => {
lastData = data;
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(() => {
if (lastData) {
callback(lastData);
lastData = null;
}
}, delay);
});
return () => {
if (timeoutId) {
clearTimeout(timeoutId);
}
cleanup();
};
}
}
// Instância global de eventos
export const globalEventEmitter = new VLibrasEventEmitter();
//# sourceMappingURL=VLibrasEvents.js.map