3
3
importScripts ( `idb-keyval-iife.min.js` )
4
4
5
5
const { NavigationRoute } = workbox . routing
6
+
7
+ let lastNavigationRequest = null
6
8
let offlineShellEnabled = true
7
9
10
+ // prefer standard object syntax to support more browsers
11
+ const MessageAPI = {
12
+ setPathResources : ( event , { path, resources } ) => {
13
+ event . waitUntil ( idbKeyval . set ( `resources:${ path } ` , resources ) )
14
+ } ,
15
+
16
+ clearPathResources : event => {
17
+ event . waitUntil ( idbKeyval . clear ( ) )
18
+ } ,
19
+
20
+ enableOfflineShell : ( ) => {
21
+ offlineShellEnabled = true
22
+ } ,
23
+
24
+ disableOfflineShell : ( ) => {
25
+ offlineShellEnabled = false
26
+ } ,
27
+ }
28
+
29
+ self . addEventListener ( `message` , event => {
30
+ const { gatsbyApi : api } = event . data
31
+ if ( api ) MessageAPI [ api ] ( event , event . data )
32
+ } )
33
+
34
+ function handleAPIRequest ( { event } ) {
35
+ const { pathname } = new URL ( event . request . url )
36
+
37
+ const params = pathname . match ( / : ( .+ ) / ) [ 1 ]
38
+ const data = { }
39
+
40
+ if ( params . indexOf ( `=` ) !== - 1 ) {
41
+ params . split ( `&` ) . forEach ( param => {
42
+ const [ key , val ] = param . split ( `=` )
43
+ data [ key ] = val
44
+ } )
45
+ } else {
46
+ data . api = params
47
+ }
48
+
49
+ if ( MessageAPI [ data . api ] !== undefined ) {
50
+ MessageAPI [ data . api ] ( )
51
+ }
52
+
53
+ if ( ! data . redirect ) {
54
+ return new Response ( )
55
+ }
56
+
57
+ return new Response ( null , {
58
+ status : 302 ,
59
+ headers : {
60
+ Location : lastNavigationRequest ,
61
+ } ,
62
+ } )
63
+ }
64
+
8
65
const navigationRoute = new NavigationRoute ( async ( { event } ) => {
66
+ // handle API requests separately to normal navigation requests, so do this
67
+ // check first
68
+ if ( event . request . url . match ( / \/ .g a t s b y - p l u g i n - o f f l i n e : .+ / ) ) {
69
+ return handleAPIRequest ( { event } )
70
+ }
71
+
9
72
if ( ! offlineShellEnabled ) {
10
73
return await fetch ( event . request )
11
74
}
12
75
76
+ lastNavigationRequest = event . request . url
77
+
13
78
let { pathname } = new URL ( event . request . url )
14
79
pathname = pathname . replace ( new RegExp ( `^%pathPrefix%` ) , `` )
15
80
@@ -36,35 +101,5 @@ const navigationRoute = new NavigationRoute(async ({ event }) => {
36
101
37
102
workbox . routing . registerRoute ( navigationRoute )
38
103
39
- // prefer standard object syntax to support more browsers
40
- const MessageAPI = {
41
- setPathResources : ( event , { path, resources } ) => {
42
- event . waitUntil ( idbKeyval . set ( `resources:${ path } ` , resources ) )
43
- } ,
44
-
45
- clearPathResources : event => {
46
- event . waitUntil ( idbKeyval . clear ( ) )
47
- } ,
48
-
49
- enableOfflineShell : ( ) => {
50
- offlineShellEnabled = true
51
- } ,
52
-
53
- disableOfflineShell : ( ) => {
54
- offlineShellEnabled = false
55
- } ,
56
- }
57
-
58
- self . addEventListener ( `message` , event => {
59
- const { gatsbyApi : api } = event . data
60
- if ( api ) MessageAPI [ api ] ( event , event . data )
61
- } )
62
-
63
- workbox . routing . registerRoute ( / \/ .g a t s b y - p l u g i n - o f f l i n e : .+ / , ( { event } ) => {
64
- const { pathname } = new URL ( event . request . url )
65
-
66
- const api = pathname . match ( / : ( .+ ) / ) [ 1 ]
67
- MessageAPI [ api ] ( )
68
-
69
- return new Response ( )
70
- } )
104
+ // this route is used when performing a non-navigation request (e.g. fetch)
105
+ workbox . routing . registerRoute ( / \/ .g a t s b y - p l u g i n - o f f l i n e : .+ / , handleAPIRequest )
0 commit comments