export const initOnEvents = ['click', 'touchstart', 'keypress', 'keydown']; export const getAudioContext = () => { let audioCtx; try { audioCtx = new (window.AudioContext || window.webkitAudioContext)(); } catch { // AudioContext is not available. } return audioCtx; }; // eslint-disable-next-line default-param-last export const getAlertAudio = async (baseUrl = '', requestContext) => { const audioCtx = getAudioContext(); let lastSource; const stopLast = () => { try { if (lastSource) { lastSource.stop(); } } catch (_) { // ignore stop errors } finally { lastSource = null; } }; const playSound = audioBuffer => { window.playAudioAlert = () => { if (audioCtx) { stopLast(); const source = audioCtx.createBufferSource(); source.buffer = audioBuffer; source.connect(audioCtx.destination); source.loop = false; source.start(); lastSource = source; source.onended = () => { if (lastSource === source) lastSource = null; }; } }; window.stopAudioAlert = stopLast; }; if (audioCtx) { const { type = 'dashboard', alertTone = 'ding' } = requestContext || {}; const resourceUrl = `${baseUrl}/audio/${type}/${alertTone}.mp3`; const audioRequest = new Request(resourceUrl); fetch(audioRequest) .then(response => response.arrayBuffer()) .then(buffer => { audioCtx.decodeAudioData(buffer).then(playSound); // eslint-disable-next-line no-promise-executor-return return new Promise(res => res()); }) .catch(() => { // error }); } };