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. eclipse + maven搭建SSM框架

    0.系统环境 1)Windows 10 企业版 2)JDK 1.8.0_131 3)Eclipse Java EE IDE for Web Developers  Version: Neon.3 Re ...

  2. js 中导出excel 较长数字串会变成科学计数法

    在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转换成 科学计数法.现在网上找到解决方案之一: (在数字串 ...

  3. 在vue配置sass

    先npm两个插件 npm install sass-loader --save-dev npm install node-sass --save-dev 然后在webpack当中配置 { test: ...

  4. Html5画钟表盘/指针实时跳动

    1.最终效果 时钟.分钟.秒指针连续移动2.完整代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&q ...

  5. MagicApp说明

    title: MagicApp说明 date: 2017-12-06 05:41:00 tags: IT 技术 MagicApp是日常处理的程序,协助进行日常工作处理 批量重命名模块 说明 该模块是根 ...

  6. linux上文件内容去重的问题uniq/awk

    1.uniq:只会对相邻的行进行判断是否重复,不能全文本进行搜索是否重复,所以往往跟sort结合使用. 例子1: [root@aaa01 ~]# cat a.txt 12 34 56 12 [root ...

  7. Django框架的简介

    Django框架的背景 Django是一款基于Python开发的全栈式一体化Web 应用框架.2003 年问世之初,它只是 美国一家报社的内部工具,2005 年 7 月使用 BSD 许可证完成了开源. ...

  8. 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算

    目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...

  9. git版本控制工具基本用法讲解(转)

    一.安装Git 在linux系统使用非常方便,只需要打开shell界面,并输入: ? 1 sudo apt-get install git-core 按下回车后输入密码,即可完成Git的安装.但我们可 ...

  10. PJ可能会考的模拟与枚举-自学教程

    PJ可能会考的模拟与枚举-自学教程 文/Pleiades_Antares 之前学校里看一个小可爱复习的时候偷偷听来着XD 简单记了一下重点吧,希望能对看官您有所帮助XD 以下⬇️是几个复习时讲过的题, ...