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 ...
随机推荐
- [转]VR原理讲解及开发入门
本文转自:http://www.52vr.com/article-661-1.html 本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和 ...
- windows server 证书的颁发与IIS证书的使用
最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选中的服务器证书 4.点击[创建证书申请] 5.填写信息 6.下一 ...
- 转STM32官方固件库简介
ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库.固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API) .固件库将这些寄 ...
- 教你怎么调用Gitlab API
1.生成Personal Access Tokens 选择右上角用户信息setting—>Access Tokens 2.常用Gitlab API #获取所有的项目信息 #private_tok ...
- Java String的简单介绍
一.String类的构造方法(先粗略介绍三种 分别是s1,s2,s3) 二.String的常用判断方法 三.String类的常用获取方法 三.Sting的常用转换方法 四.String其他功能 五 ...
- 【读书笔记】iOS-手势识别
一,事件处理机制 事件是当用户手指触及屏幕,或地屏幕上滑动,或摇晃设备等时候,系统不断地把这些事件通过消息发送给应用程序对象.在iOS设备中能够捕获的事件有3种:触摸事件,移动事件和多媒体远程控制事件 ...
- Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
解决Python安装包时提示Unable to find vcvarsall.bat的问题 by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...
- dubbo-admin管理控制台的安装部署(最简单)
Dubbo-admin最简单的安装部署,十分钟就能搞定! 网上找的安装教程虽说详细,但是就是因为详细操作起来而显得繁琐.今天,我帮大家跳过这些繁琐的步骤,简单快捷的安装部署dubbo-admin. 1 ...
- 1.Spring MVC详解
目录 1.SpringMVC 详细介绍 2.SpringMVC 处理请求流程 3.配置前端控制器 4.配置处理器适配器 5.编写 Handler 6.配置处理器映射器 7.配置视图解析器 8.Disp ...
- 【redis专题(1)】安装与启动
简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo(redis之父)写的key-value存储系统. Redis提供了一些丰富的数据 ...