是否可以像所有针对普通 HTTP 请求的示例一样在 Service Worker 中拦截和缓存 WebSocket 消息?
Is it possible to intercept and cache WebSocket messages in a Service Worker like all the examples do for normal HTTP requests?
我知道您可以从 Service Worker 本身内部创建 WebSocket 连接;我的问题更多的是,您是否可以像往常一样从您的应用程序使用 WebSocket,并让 Service Worker 拦截/缓存 WebSocket 请求,就像它对普通 HTTP 提取请求所做的那样?
这是一个拦截和缓存来自 Service Worker 的普通 HTTP 请求的示例。
self.addEventListener('fetch', function(event) {
// If a match isn't found in the cache, the response
// will look like a connection error
event.respondWith(caches.match(event.request));
});
如果我的所有请求都通过 WebSockets,我将如何设置 Service Worker?
Service Worker 无法拦截 Web Socket 流量。
Service Worker 的 fetch
事件仅针对受控客户端的 HTTPS 请求触发,message
事件仅针对来自客户端的 postMessage()
请求触发。
虽然 there is an HTTP handshake 在启动 Web Socket 连接时,握手不会触发 fetch
处理程序,连接建立后发送的实际流量也不会。
我认为应该在第一次加载页面时使用 fetch
,这样它的数据可以在您离线时由 service worker 缓存和返回。
因此,只有在线时才启动 websocket 连接。那就不用缓存数据了。
当无法通过套接字发送消息时,您会在应用程序端的缓存中保存消息。
我知道您可以从 Service Worker 本身内部创建 WebSocket 连接;我的问题更多的是,您是否可以像往常一样从您的应用程序使用 WebSocket,并让 Service Worker 拦截/缓存 WebSocket 请求,就像它对普通 HTTP 提取请求所做的那样?
这是一个拦截和缓存来自 Service Worker 的普通 HTTP 请求的示例。
self.addEventListener('fetch', function(event) {
// If a match isn't found in the cache, the response
// will look like a connection error
event.respondWith(caches.match(event.request));
});
如果我的所有请求都通过 WebSockets,我将如何设置 Service Worker?
Service Worker 无法拦截 Web Socket 流量。
Service Worker 的 fetch
事件仅针对受控客户端的 HTTPS 请求触发,message
事件仅针对来自客户端的 postMessage()
请求触发。
虽然 there is an HTTP handshake 在启动 Web Socket 连接时,握手不会触发 fetch
处理程序,连接建立后发送的实际流量也不会。
我认为应该在第一次加载页面时使用 fetch
,这样它的数据可以在您离线时由 service worker 缓存和返回。
因此,只有在线时才启动 websocket 连接。那就不用缓存数据了。
当无法通过套接字发送消息时,您会在应用程序端的缓存中保存消息。