码迷,mamicode.com
首页 > Web开发 > 详细

MetaMask/sw-controller

时间:2018-11-07 17:11:54      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:interval   with   timeout   read   keepalive   default   optional   stream   message   

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 || 60000
    this.keepAliveIntervalRef = null
    this.keepAliveDelay = opts.keepAliveDelay || 0
    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

标签:interval   with   timeout   read   keepalive   default   optional   stream   message   

原文地址:https://www.cnblogs.com/wanghui-garcia/p/9915567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!