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 ...
随机推荐
- ILSpy
今日为找泛型序列的一个Select方法源码,就去找了个ILSpy反编译工具. 工具下载地址:http://www.fishlee.net/service/softarchive/57,一般选择较新的. ...
- [css] css3 中的新特性加强记忆
css3被拆分成如下的小模块,选择器,盒模型,背景和边框,文字特效,2D/3D转换,动画,多列布局和用户界面 2D转换 使用transform:属性来为元素设置2D转换,兼容浏览器加前缀 –webki ...
- Java学习笔记之——类与对象
1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- 配置supervisor管理beego应用
一.golang.beego等环境安装与配置 二.supervisor安装 github项目地址:https://github.com/Supervisor/supervisor 克隆项目:git c ...
- fullScreen.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- linux学习笔记-解决google-chrome打开后弹出输入密码以解锁您的登录密钥环的提示
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.理论知识 1.密钥的作用 google-chrome存储了网站登录时使用的账号和密码信息,这个密钥是用来保护这些信息的 2. ...
- 微信小程序实现验证码倒计时效果
效果图 wxml <input class='input-pwd' placeholder="新密码" placeholder-style='color: #000' pas ...
- thymeleaf-extras-db 0.0.1发布,select标签加载数据的新姿势
在写thymeleaf页面的时候,我为了偷懒,不想为每个select下拉列表框都写一个接口,于是这个懒人jar诞生了.该jar的核心功能是直接通过thymeleaf页面的自定义标签的属性,直接运行sq ...
- java Name [jdbc/myjavadb] is not bound in this Context. Unable to find [jdbc].
一.出错时的情况: 首先,这是一个servlet项目 1.项目的web.xml配置了:(后来发现不配置这个也行,但是tomcat一定要配置) <resource-ref> <desc ...