Ich habe einen Service-Mitarbeiter, der Anfragen meiner Seite abfängt (fetch
Ereignis), und wenn die URL mit einem bestimmten Muster übereinstimmt, würde es eine andere URL holen und die Antwort durch diesen neuen Inhalt ersetzen. Es funktioniert perfekt für Textdaten (JS, XML ...) oder binäre Daten (z. B. Bilder), aber wenn es um Video geht, gibt es einen Fehler.Wie kann ich ein Video von einem ServiceWorker streamen?
Ich verwende Chrome 41 unter OSX.
Dies ist der vereinfachte Code meiner Arbeiter:
self.addEventListener('fetch', function(event) {
var url = event.request.url;
console.log('SW: fetch', url);
if (/\.mp4$/.test(url)) {
url = 'https://vjs.zencdn.net/v/oceans.mp4';
var options = {
credentials: 'include',
mode: 'no-cors'
};
event.respondWith(fetch(url, options));
}
});
Und dies ist der vereinfachte Code in meinem HTML-Seite:
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.info('ServiceWorker registration successful for', reg.scope);
var video = document.createElement('video');
video.src = '/video.mp4';
video.controls = true;
video.autoplay = true;
video.onerror = function(err) {
console.error('Video load fail', err);
}
video.onload = function(data) {
console.info('Video load success');
}
document.body.appendChild(video);
}).catch(function(err) {
console.error('ServiceWorker registration failed:', err);
});
Das erste Mal, wenn Sie die Seite lädt, installiert der Arbeiter, Die Videoanforderung wird also nicht abgefangen und schlägt somit fehl. Wenn Sie die Seite jedoch neu laden (ohne den Cache zu bereinigen), wird sie erfolgreich abgefangen, und der Worker lädt das Video erfolgreich (HTTP 200 in seinem Inspektor), aber aus irgendeinem Grund wirft die Hauptseite eine net::ERR_FAILED
.
Und ich kann nicht manuell lesen/es streamen, weil sie von einem anderen Ursprung kommen, was zu einem „opaque“ Antworttyp: http://www.w3.org/TR/service-workers/#cross-origin-resources
UPDATE: Update auf Chrome 42, der Fehler ist jetzt HTTP 400 Service Worker Fallback Required (from ServiceWorker)
. Seltsame Sache ist, dass the source code (Zeile 510) angibt, dass es nur ausgelöst werden sollte, wenn CORS-Header fehlen, aber hier ist der Modus no-cors
.
Vielen Dank Jeff, CORS Header waren in der Tat das Problem! – antoine129
Ich habe ein Problem auf dem Chromium-Tracker geöffnet, um das Debugging zu verbessern: https://code.google.com/p/chromium/issues/detail?id=477685 – antoine129