forked from cybrespace/pinafore
		
	more work on service worker
This commit is contained in:
		
							parent
							
								
									0b442bb2a6
								
							
						
					
					
						commit
						01243ba4c1
					
				
					 3 changed files with 84 additions and 28 deletions
				
			
		
							
								
								
									
										14
									
								
								routes/_utils/asyncModules.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								routes/_utils/asyncModules.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
const importURLSearchParams = () => import(
 | 
			
		||||
  /* webpackChunkName: 'url-search-params' */ 'url-search-params'
 | 
			
		||||
  ).then(Params => {
 | 
			
		||||
  window.URLSearchParams = Params
 | 
			
		||||
  Object.defineProperty(window.URL.prototype, 'searchParams', {
 | 
			
		||||
    get() {
 | 
			
		||||
      return new Params(this.search)
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  importURLSearchParams
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,16 +1,19 @@
 | 
			
		|||
import { init } from 'sapper/runtime.js';
 | 
			
		||||
import { init } from 'sapper/runtime.js'
 | 
			
		||||
import toast from '../routes/_utils/toast.js'
 | 
			
		||||
 | 
			
		||||
// polyfills
 | 
			
		||||
Promise.all([
 | 
			
		||||
  typeof URLSearchParams === 'undefined' && import(/* webpackChunkName: 'url-search-params' */ 'url-search-params').then(Params => {
 | 
			
		||||
    window.URLSearchParams = Params
 | 
			
		||||
    Object.defineProperty(window.URL.prototype, 'searchParams', {
 | 
			
		||||
      get() {
 | 
			
		||||
        return new Params(this.search)
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
  typeof URLSearchParams === 'undefined' && importURLParams()
 | 
			
		||||
]).then(() => {
 | 
			
		||||
  // `routes` is an array of route objects injected by Sapper
 | 
			
		||||
  init(document.querySelector('#sapper'), __routes__)
 | 
			
		||||
 | 
			
		||||
  if (navigator.serviceWorker && navigator.serviceWorker.controller) {
 | 
			
		||||
    navigator.serviceWorker.controller.onstatechange = (e) => {
 | 
			
		||||
      if (e.target.state === 'redundant') {
 | 
			
		||||
        toast.say('App update available. Reload to update.');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -36,8 +36,18 @@ self.addEventListener('activate', event => {
 | 
			
		|||
  )
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const NETWORK_ONLY = [
 | 
			
		||||
  '/oauth'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
const CACHE_FIRST = [
 | 
			
		||||
  '/api/v1/accounts/verify_credentials',
 | 
			
		||||
  '/system/accounts/avatars'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
self.addEventListener('fetch', event => {
 | 
			
		||||
  const url = new URL(event.request.url)
 | 
			
		||||
  const req = event.request
 | 
			
		||||
  const url = new URL(req.url)
 | 
			
		||||
 | 
			
		||||
  // don't try to handle e.g. data: URIs
 | 
			
		||||
  if (!url.protocol.startsWith('http')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +56,7 @@ self.addEventListener('fetch', event => {
 | 
			
		|||
 | 
			
		||||
  // always serve assets and webpack-generated files from cache
 | 
			
		||||
  if (cached.has(url.pathname)) {
 | 
			
		||||
    event.respondWith(caches.match(event.request))
 | 
			
		||||
    event.respondWith(caches.match(req))
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,24 +65,53 @@ self.addEventListener('fetch', event => {
 | 
			
		|||
  // app, but if it's right for yours then uncomment this section
 | 
			
		||||
 | 
			
		||||
  if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) {
 | 
			
		||||
    event.respondWith(caches.match('/index.html'));
 | 
			
		||||
    return;
 | 
			
		||||
    event.respondWith(caches.match('/index.html'))
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Non-GET and for certain endpoints (e.g. OAuth), go network-only
 | 
			
		||||
  if (req.method !== 'GET' ||
 | 
			
		||||
      NETWORK_ONLY.some(pattern => url.pathname.startsWith(pattern))) {
 | 
			
		||||
    console.log('Using network-only for', url.href)
 | 
			
		||||
    event.respondWith(fetch(req))
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // For these, go cache-first.
 | 
			
		||||
  if (CACHE_FIRST.some(pattern => url.pathname.startsWith(pattern))) {
 | 
			
		||||
    console.log('Using cache-first for', url.href)
 | 
			
		||||
    event.respondWith(caches
 | 
			
		||||
      .open(`offline${timestamp}`)
 | 
			
		||||
      .then(async cache => {
 | 
			
		||||
        let response = await cache.match(req)
 | 
			
		||||
        if (response) {
 | 
			
		||||
          // update asynchronously
 | 
			
		||||
          fetch(req).then(response => {
 | 
			
		||||
            cache.put(req, response.clone())
 | 
			
		||||
          })
 | 
			
		||||
          return response
 | 
			
		||||
        }
 | 
			
		||||
        response = await fetch(req)
 | 
			
		||||
        cache.put(req, response.clone())
 | 
			
		||||
        return response
 | 
			
		||||
      }))
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // for everything else, try the network first, falling back to
 | 
			
		||||
  // cache if the user is offline. (If the pages never change, you
 | 
			
		||||
  // might prefer a cache-first approach to a network-first one.)
 | 
			
		||||
  event.respondWith(
 | 
			
		||||
    caches
 | 
			
		||||
  event.respondWith(caches
 | 
			
		||||
    .open(`offline${timestamp}`)
 | 
			
		||||
    .then(async cache => {
 | 
			
		||||
      try {
 | 
			
		||||
          const response = await fetch(event.request)
 | 
			
		||||
          cache.put(event.request, response.clone())
 | 
			
		||||
        console.log('Using network-first for', url.href)
 | 
			
		||||
        const response = await fetch(req)
 | 
			
		||||
        cache.put(req, response.clone())
 | 
			
		||||
        return response
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
          const response = await cache.match(event.request)
 | 
			
		||||
        const response = await cache.match(req)
 | 
			
		||||
        if (response) {
 | 
			
		||||
          return response
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue