export default class AudioPlayer { players = {} play({ item, restart, loop }) { return new Promise((resolve, reject) => { const { id, url } = item if (id in players) { if (restart) { players[id].currentTime = 0 players[id].play() return resolve() } return reject() } const player = document.createElement('audio') const handleEnded = () => { unbind() resolve() } const handleError = (error) => { console.error(error) unbind() reject(error) } const bind = () => { player.addEventListener('ended', handleEnded) player.addEventListener('error', handleError) this.players[id] = player } const unbind = () => { player.removeEventListener('ended', handleEnded) player.removeEventListener('error', handleError) delete this.players[id] } const start = () => { player.src = url player.play() } bind() start() }) } }