服务人员订阅-数据库可靠性

时间:2019-12-14 14:21:46

标签: javascript firebase-realtime-database service-worker service-worker-events

我有一个基于React Redux和Firebase实时数据库构建的应用程序,用于存储。

我已经按照the Mozilla developer documentation中的说明设置了服务工作者订阅。 在90%的情况下,一切正常,但有时由于某些原因未执行数据库写入sendSubscriptionToServer(subscription);

结果是客户端具有有效且活动的订阅,但该应用没有该订阅的重新排序。

我要做的是检查连接的客户端订阅是否存储在数据库中,如果没有,则将其推送到数据库中。

有推荐的方法吗?

我现在要做的是将用户服务工作者的订阅存储在Redux存储中,并对照那些内容进行检查,以查看是否缺少缺少的订阅。

// sense if browser/user combo has a subscription
export const hasSwSubscription = async ({uid, serviceWorkerSubscrObj}) => {
  // uid : firebase user database id
  // serviceWorkerSubscrObj : Users subscriptions from Redux store 
  let result = false

  // Exit if no service worker
  if (!('serviceWorker' in navigator)) { 
    console.log('No service worker')
    return result
  }

  try{
    const serviceWorkerReg = await navigator.serviceWorker.ready.then((swreg) => swreg)
    const subscription = await serviceWorkerReg.pushManager.getSubscription()

    if (subscription !== null) {
      result = true

      // Check if subscription is in database
      const mySwSub = subscription.toJSON()
      let isSwSubInDatabase = false
      Object.keys(serviceWorkerSubscrObj).forEach( (serviceWorkerSubscr) => {
        const endpoint = (serviceWorkerSubscr.endpoint) ? serviceWorkerSubscr.endpoint : ''
        if(!isSwSubInDatabase){
          isSwSubInDatabase = (mySwSub.endpoint === endpoint)
        }
      })

      // Insert in database if missing
      const hasUid = (uid) ? true : false
      if(hasUid){
        const dbPath = `/serviceWorkerSubscriptions/${uid}`
        console.log('Mend Subscription', mySwSub)
        const newRef = database.ref(dbPath).push()
        const key = newRef.key
        database.ref(`${dbPath}/${key}`).set(mySwSub)
        .then((res) => {
          // Pushed to database --> Redux store will be updated
        })
        .catch((err) => {
          console.error('Mend push error', err)
        })
      }

    }

  }catch(err){
    console.log(err)
  }

  return result
}

由于商店通过firebase.on()订阅更新,因此这种方法可能会产生永恒的循环。

是否有更好的和/或推荐的方法来处理此问题?

非常感谢/ K

0 个答案:

没有答案