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的更多相关文章

  1. 重构Web Api程序(Api Controller和Entity)续篇

    昨天有写总结<重构Web Api程序(Api Controller和Entity)>http://www.cnblogs.com/insus/p/4350111.html,把一些数据交换的 ...

  2. Grails 1.2参考文档速读(10):Controller

    转载:http://keyvalue.blog.51cto.com/1475446/303260       从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ...

  3. Floodlight Controller 路线原则

         SDN的出现能够使得各种复杂的路由协议从原本的Device OS中剥离出来,放在SDN Controller中.Controller用一种简单的协议来和全部的Router进行通信.就能够获得 ...

  4. kubernets controller 和 CRD 具体组件分析

    (dlv) b k8s.io/sample-controller/pkg/client/informers/externalversions.(*sharedInformerFactory).Info ...

  5. MetaMask/metamask-extension/mascara 的运行实现

    https://github.com/MetaMask/metamask-extension/tree/develop/mascara 找了很多个实例,基本上很少是不使用线上钱包的,只有metamas ...

  6. metamask源码学习-controller-transaction

    ()metamask-extension/app/scripts/controllers/transactions Transaction Controller is an aggregate of ...

  7. metamask源码学习-background.js

    这个就是浏览器后台所进行操作的地方了,它就是页面也区块链进行交互的中间部分. metamask-background描述了为web扩展单例的文件app/scripts/background.js.该上 ...

  8. metamask源码学习-metamask-controller.js

    The MetaMask Controller——The central metamask controller. Aggregates other controllers and exports a ...

  9. Guide to Porting MetaMask to a New Environment

    https://github.com/MetaMask/metamask-extension/blob/develop/docs/porting_to_new_environment.md MetaM ...

随机推荐

  1. AngularJS初始化Select选择框

    一.引入 之前一个离职的同事负责的项目大量的引入了AngularJS的JS框架,后来我接手相关他项目里的功能.由于对AngularJS不是太熟,在他的功能上进行二次开发就比较费劲了,印象比较深的一个就 ...

  2. Java框架之Struts2(三)

    一.几种国际化输出方式 国际化:国际化的本质,就是查找,替换.程序界面上输出的是国际化消息的 key 所对应的值.Struts2 中的国际化机制,会根据 key 到资源文件中找对应的文本来替换上面的k ...

  3. 【Java并发编程】19、DelayQueue源码分析

    DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间).DelayQueue的泛型参数需要实现Delayed接口,Del ...

  4. Spring Boot 1.5.* 升级 2.1 - 完善中

    Spring Boot 原版本 1.5.12.RELEASE 新版本 2.1.0.RELEASE Spring Cloud 原版本 Edgware.SR3 新版本 Finchley.SR2 一.Act ...

  5. Mysql无法选取非聚合列

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)Mysql 无法选取非聚合列. 更多讨论或者错误提交,也请移步. 1. 前言 最近升级博客,给文章页 ...

  6. js小知识

    1.重新声明js变量,变量值不丢失 2.background-color 使用jquery获取样式中的background-color的值时发现在获取到的颜色值在IE中与Chrome.Firefox显 ...

  7. LeanCloud云引擎相关问题

    (1).Windows 用户可以在 Github releases 页面 根据操作系统版本下载最新的 32 位 或 64 位 msi 安装包进行安装,安装成功之后在 Windows 命令提示符(或 P ...

  8. flow-vue.js移动端效果

    得益于vue.js和element,以及vue-element-extends在线表格编辑.前后端分离的后端用golang+beego框架,服务器采用腾讯云. vue的自适应做的很好,只要将侧栏加一行 ...

  9. winsock编程学习笔记

    以下部分转自博客http://blog.csdn.net/phunxm/article/details/5085869 套接字地址(sockaddr.sockaddr_in) /* * Structu ...

  10. (后台)Java:对double值进行四舍五入,保留两位小数的几种方法

    mport java.text.DecimalFormat; DecimalFormat df = new DecimalFormat("######0.00"); double ...