MetaMask/sw-controller
https://github.com/MetaMask/sw-controller
Service Worker Controller
Used to register a service worker and listen for a ready event. Can be used with sw-stream for easy plumbing.
这个模块是用来登录一个service worker并监听准备好的事件。可以与sw-stream结合使用
Usage
const SwController = require('sw-controller')
const createSwStream = require('sw-stream')
const controller = new SwController({
  fileName: '/service-worker.js',
  // optional, scope used when registering service worker
  scope: '/',
  // default: true, pings the service worker to keep it alive
  keepAlive: true,
})
controller.once('ready', () => {
  const swStream = createSwStream({
    serviceWorker: controller.getWorker(),
  })
  // talk to the service worker
})
controller.startWorker()
sw-controller/lib/index.js
const EventEmitter = require('events')
module.exports = class ClientSideServiceWorker extends EventEmitter {
  constructor (opts) {
    super()
    // opts
    this.fileName = opts.fileName
    this.scope = opts.scope
    this.keepAlive = opts.keepAlive === undefined ? true : opts.keepAlive
    // service worker refs
    this.serviceWorkerApi = navigator.serviceWorker
    this.activeServiceWorker = null
    // ready status
    this.ready = false
    this.once('ready', () => this.ready = true)
    // keep alive
    this.keepAliveActive = false
    this.keepAliveInterval = opts.keepAliveInterval ||
    this.keepAliveIntervalRef = null
    this.keepAliveDelay = opts.keepAliveDelay ||
    if (this.keepAlive) {
      this.once('ready', () => this.startKeepAlive())
    }
    // start
    if (opts.autoStart) this.startWorker()
  }
  getWorker() {
    return this.activeServiceWorker || this.serviceWorkerApi.controller
  }
  async startWorker () {
    const registeredWorker = await this.registerWorker()
    // forward messages and errors
    this.serviceWorkerApi.addEventListener('message', (messageEvent) => this.emit('message', messageEvent))
    this.serviceWorkerApi.addEventListener('error', (err) => this.emit('error', err))
    const swReady = await this.serviceWorkerApi.ready
    this.activeServiceWorker = swReady.active
    this.activeServiceWorker.onerror = (err) => this.emit('error', err)
    this.emit('ready', this.activeServiceWorker)
  }
  async registerWorker () {
    const registeredWorker = await this.serviceWorkerApi.register(this.fileName, { scope: this.scope })
    registeredWorker.onupdatefound = (event) => {
      this.emit('updatefound')
      registeredWorker.update()
    }
    return registeredWorker
  }
  sendMessage (message) {
    return new Promise((resolve, reject) => {
      const messageChannel = new MessageChannel()
      messageChannel.port1.onmessage = (event) => {
        if (event.data.err) {
          reject(event.data.error)
        } else {
          resolve(event.data.data)
        }
      }
      this.getWorker().postMessage(message, [messageChannel.port2])
    })
  }
  startKeepAlive () {
    if (this.keepAliveActive) return
    this.keepAliveActive = true
    setTimeout(() => {
      this.keepAliveIntervalRef = setInterval(() => {
        this.emit('sendingWakeUp')
        this.sendMessage('wakeup')
      }, this.keepAliveInterval)
    }, this.keepAliveDelay)
  }
  stopKeepAlive () {
    if (!this.keepAliveActive) return
    clearInterval(this.keepAliveIntervalRef)
    this.keepAliveIntervalRef = null
    this.keepAliveActive = false
  }
}
MetaMask/sw-controller的更多相关文章
- 重构Web Api程序(Api Controller和Entity)续篇
		昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ... 
- Grails 1.2参考文档速读(10):Controller
		转载:http://keyvalue.blog.51cto.com/1475446/303260 从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ... 
- Floodlight Controller 路线原则
		SDN的出现能够使得各种复杂的路由协议从原本的Device OS中剥离出来,放在SDN Controller中.Controller用一种简单的协议来和全部的Router进行通信.就能够获得 ... 
- kubernets controller 和 CRD 具体组件分析
		(dlv) b k8s.io/sample-controller/pkg/client/informers/externalversions.(*sharedInformerFactory).Info ... 
- MetaMask/metamask-extension/mascara 的运行实现
		https://github.com/MetaMask/metamask-extension/tree/develop/mascara 找了很多个实例,基本上很少是不使用线上钱包的,只有metamas ... 
- metamask源码学习-controller-transaction
		()metamask-extension/app/scripts/controllers/transactions Transaction Controller is an aggregate of ... 
- metamask源码学习-background.js
		这个就是浏览器后台所进行操作的地方了,它就是页面也区块链进行交互的中间部分. metamask-background描述了为web扩展单例的文件app/scripts/background.js.该上 ... 
- metamask源码学习-metamask-controller.js
		The MetaMask Controller——The central metamask controller. Aggregates other controllers and exports a ... 
- Guide to Porting MetaMask to a New Environment
		https://github.com/MetaMask/metamask-extension/blob/develop/docs/porting_to_new_environment.md MetaM ... 
随机推荐
- Docker 安装MySQL5.7(三)
			Docker 安装MySQL5.7 1.搜索docker镜像(可以看到搜索的结果,这个结果是按照一定的星级评价规则排序的) docker search mysql 2.拉取docker的mysql镜像 ... 
- SpringCloud初体验之Eureka
			Eureka简介 SpringBoot简化了Spring工程的复杂度,之前复杂的Spring工程被拆分成了一个个小的SpringBoot工程.那么SpringBoot之间如何通讯,相互获取信息呢?这就 ... 
- 使用git push命令如何忽略不想提交的文件夹或者文件
			如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ... 
- 重定向,/dev/null, 1>, 2>什么意思?
			文件描述符我们常见的就是系统预留的0,1和2这三个,他们的意义分别有如下对应关系: 0 —— stdin(标准输入) 1 —— stdout (标准输出) 2 —— stderr (标准错误) 其中, ... 
- 浮动布局float
			浮动 浮动是css里面布局用的最多的属性. .box1{ float: left; width: 300px; ... 
- Kotlin入门(17)等式判断的情况
			话说等式可是编程语言最基本的表达式之一,不管哪种高级语言,无一例外都采用双等号“==”判断两个变量是否相等:就算是复杂的对象,在Java中也可通过equals函数判断两个实例是否相等.按理说这些能够满 ... 
- Spring 事件
			JDK事件 java通过java.util.EventObject类和java.util.EventListener接口描述事件和监听器 事件源,事件的产生者,任何一个EventObject都必须拥有 ... 
- okhttp 的使用
			①在OK HTTP 的GitHub上下载 jar 包 或者添加 grad'le依赖 OK HTTP 的地址 : https://github.com/square/okhttp ②导入jar包不想 ... 
- JMeter—前置处理器(九)
			参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第四节前置处理器前置处理器用来处理请求前的一些准备工作,比如参数设置.环境变变量设置等 一.BeanShell ... 
- 使用wxpy自动发送微信消息
			思路整理:1.进入心灵鸡汤网页,使用python获取心灵鸡汤内容 2.登陆微信,找到需要发送的朋友 3.发送获取的内容 1.获取心灵鸡汤的内容 如下图,获取第一条鸡汤 实现如下: 2.登陆微信,搜索朋 ... 
