typescript Service Worker体系结构:有效的令牌处理和网络请求同步

sy5wg1nm  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(396)

TL;DR:我需要一种机制来在服务工作者中为我的应用程序保存授权令牌,这将被网络请求使用。此令牌将定期更新(15分钟)。如果当前正在获取令牌,则所有网络请求都应该等待令牌被获取,并使用令牌的新值。
我正在构建一个通过令牌处理身份验证的Web应用程序。由于这个应用程序只应该被用作本机应用程序(使用TWA),我想利用服务工作者来处理网络请求。

要求:

  • Service Worker启动并首次获取令牌,并将其存储在内存中的变量中。
  • 网络请求使用此令牌进行授权。
  • 如果在获取令牌时**发出了一些请求,则它们应该等待令牌被获取,然后在令牌更新后继续。
  • 类似地,当在某个短间隔之后再次获取令牌时,也应该发生相同的情况。令牌生命周期本质上是“重置”。

最接近的方法是使用Promises,但由于promises不能更新,因此我尝试使用proxy来实现此效果。
以下是我的尝试:在JavaScript中使用代理的可更新promise
它可能最好通过一些修改形式的“Observables”来实现,但我还没有完全理解它。

osh3o9ms

osh3o9ms1#

不需要改变promise对象本身--这是不可能的,一旦它被锁定到一个值,它就会保持这个值。你可以用另一个Promise来代替它。网络请求将使用当前存储在变量中的promise--该promise要么已经实现,要么是令牌正在更新时的未决promise,因此它们只需等待。

async function getToken() { … }
let tokenPromise = getToken();
setInterval(() => {
  tokenPromise = getToken();
}, 15*60*1000);
async function request(…) {
  const token = await tokenPromise;
  return fetch(… token …);
}

(You还需要考虑错误处理,如果getToken()失败,它将存储一个拒绝的承诺,并阻止request在接下来的15分钟内工作。我会把tokenPromise = null改为getToken(),并在第一个需要它的请求上重新尝试getToken(),同时重新安排时间间隔。

相关问题