当数据被 DEFLATE 压缩时,service worker 推送事件数据为空
service worker push event data is null when data is DEFLATE compressed
我在网络应用程序中使用网络推送 API 来侦听来自我的服务器的更新。这个更新数据是普通的 JSON,但对于网络推送来说太大了 API,所以我决定压缩。但是,当我这样做时,serviceworker 中推送事件的 event.data
参数始终为 null。这很奇怪,因为应用程序在没有这种压缩的情况下仍能正常运行,并且浏览器接收推送时没有错误。
这是我的 TS 代码,使用 pako 进行解压(虽然它永远不会到那个点):
(self as any).addEventListener('push', async (event: PushEvent) => {
//This should be the DEFLATE compressed JSON
const raw = pako.inflate(event.data.arrayBuffer()) //errors here due to data null
const payload = JSON.parse(raw) as rideTime[]
console.debug("received push from server")
event.waitUntil(handlePush(payload, event))
});
here's chrome accepting the push. 之后推送事件成功发送。
据我所知,网络推送 API 应该与二进制消息兼容,但我使用的任何压缩算法都会导致此问题。任何线索表示赞赏。谢谢
事实证明,作为网络推送负载发送的数据必须是文本。这当然意味着要发送二进制数据,必须对有效负载进行 base64 编码。未能对压缩数据执行此操作是我出现问题的原因,与压缩无关。
我在网络应用程序中使用网络推送 API 来侦听来自我的服务器的更新。这个更新数据是普通的 JSON,但对于网络推送来说太大了 API,所以我决定压缩。但是,当我这样做时,serviceworker 中推送事件的 event.data
参数始终为 null。这很奇怪,因为应用程序在没有这种压缩的情况下仍能正常运行,并且浏览器接收推送时没有错误。
这是我的 TS 代码,使用 pako 进行解压(虽然它永远不会到那个点):
(self as any).addEventListener('push', async (event: PushEvent) => {
//This should be the DEFLATE compressed JSON
const raw = pako.inflate(event.data.arrayBuffer()) //errors here due to data null
const payload = JSON.parse(raw) as rideTime[]
console.debug("received push from server")
event.waitUntil(handlePush(payload, event))
});
here's chrome accepting the push. 之后推送事件成功发送。
据我所知,网络推送 API 应该与二进制消息兼容,但我使用的任何压缩算法都会导致此问题。任何线索表示赞赏。谢谢
事实证明,作为网络推送负载发送的数据必须是文本。这当然意味着要发送二进制数据,必须对有效负载进行 base64 编码。未能对压缩数据执行此操作是我出现问题的原因,与压缩无关。