【发布时间】:2022-01-09 14:29:21
【问题描述】:
我正在尝试构建一个服务工作者,如果可用则从缓存中检索视频,如果不可用则从在线获取。这是我的代码:
self.addEventListener("fetch", function (event) {
if (event.request.headers.get("range")) {
caches.match(event.request.url).then(function (res) {
if (!res) {
log.debug(
`Range request NOT found in cache for ${event.request.url}, activating fetch...`
);
return fetch(event.request);
}
returnRangeRequest(event);
});
} else {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
}
});
function returnRangeRequest(event) {
var rangeHeader = event.request.headers.get("range");
var rangeMatch = rangeHeader.match(/^bytes\=(\d+)\-(\d+)?/);
var pos = Number(rangeMatch[1]);
var pos2 = rangeMatch[2];
if (pos2) {
pos2 = Number(pos2);
}
event.respondWith(
caches
.match(event.request.url)
.then(function (res) {
return res.arrayBuffer();
})
.then(function (ab) {
let responseHeaders = {
status: 206,
statusText: "Partial Content",
headers: [
["Content-Type", "video/mp4"],
[
"Content-Range",
"bytes " +
pos +
"-" +
(pos2 || ab.byteLength - 1) +
"/" +
ab.byteLength,
],
],
};
var abSliced = {};
if (pos2 > 0) {
abSliced = ab.slice(pos, pos2 + 1);
} else {
abSliced = ab.slice(pos);
}
log.debug(
`Returning range request response`
);
return new Response(abSliced, responseHeaders);
})
.catch(function (err) {
log.error(err);
})
);
}
当我在线并尝试播放视频时,它可以正常工作并打印调试行Range request NOT found in cache for https://example.com/vid.mp4, activating fetch...
当我使用cache.add("https://example.com/vid.mp4"); 缓存视频网址并尝试播放时,视频播放正常。
当我在 iPad 上关闭 Wifi 时出现问题。当我打开wifi后尝试播放视频时,视频停留在0:00,总长度为0:00。
我的一些发现:
- 当我打开 wifi 并缓存视频时,有两个使用字节
bytes=0-1和bytes=0-4444000发出的请求。 - 当我关闭 wifi 时,会发出对
bytes=0-1的请求,但它会停止。
我哪里错了?
【问题讨论】:
标签: javascript ios video safari service-worker