function testmediasource(config) { return new Promise(function(resolve, reject) { // Fetch the media resources var fetches = [config.audioPath, config.videoPath].map(function(path) { return fetch(path).then(function(response) { if (!response.ok) throw new Error('Resource fetch failed'); return response.arrayBuffer(); }); }); Promise.all(fetches).then(function(resources) { config.audioMedia = resources[0]; config.videoMedia = resources[1]; // Create media source var source = new MediaSource(); source.done = new Promise(function(resolvesource,rejectsource){ // Create and fill source buffers when the media source is opened source.addEventListener('sourceopen', onSourceOpen); resolve(source); function onSourceOpen(event) { var audioSourceBuffer = source.addSourceBuffer(config.audioType), videoSourceBuffer = source.addSourceBuffer(config.videoType); audioSourceBuffer.addEventListener('updateend',onUpdateEnd); videoSourceBuffer.addEventListener('updateend',onUpdateEnd); audioSourceBuffer.appendBuffer(config.audioMedia); videoSourceBuffer.appendBuffer(config.videoMedia); function onUpdateEnd(event){ event.target.removeEventListener('updateend', onUpdateEnd); if (!audioSourceBuffer.updating && !videoSourceBuffer.updating) { if (source.readyState !== 'open') { rejectsource(new Error("Media source error")); } else { source.endOfStream(); resolvesource(); } } } } }); }); }); }