Updated 96 files via CloudCannon
|
@ -124,6 +124,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -240,7 +243,7 @@ Open your mind, open the source!</p>
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -365,7 +368,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -384,7 +387,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -417,5 +420,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -226,7 +229,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -364,7 +367,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -383,7 +386,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -416,5 +419,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
<title>About | 徒 setto セット</title>
|
<title>About | 徒 setto セット</title>
|
||||||
<meta name="title" content="About | 徒 setto セット" />
|
<meta name="title" content="About | 徒 setto セット" />
|
||||||
<meta name="description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
<meta name="description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
||||||
<meta name="dc.date.modified" scheme="ISO8601" content="2020-07-27T10:30:14+00:00" />
|
<meta name="dc.date.modified" scheme="ISO8601" content="2020-08-05T17:06:29+00:00" />
|
||||||
<meta name="robots" content="index" />
|
<meta name="robots" content="index" />
|
||||||
|
|
||||||
<link rel="canonical" href="https://setto.basspistol.com/about/" />
|
<link rel="canonical" href="https://setto.basspistol.com/about/" />
|
||||||
|
@ -62,7 +62,7 @@
|
||||||
<meta name="dcterms.Subject" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
<meta name="dcterms.Subject" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
||||||
<meta name="dcterms.Title" content="About" />
|
<meta name="dcterms.Title" content="About" />
|
||||||
<meta name="dcterms.Contributor" content="徒 setto セット" />
|
<meta name="dcterms.Contributor" content="徒 setto セット" />
|
||||||
<meta name="dcterms.Date" content="2020-07-27" />
|
<meta name="dcterms.Date" content="2020-08-05" />
|
||||||
<meta name="dcterms.Description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
<meta name="dcterms.Description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
||||||
|
|
||||||
<!-- Facebook -->
|
<!-- Facebook -->
|
||||||
|
@ -73,14 +73,14 @@
|
||||||
<meta property="og:url" content="https://setto.basspistol.com/about/" />
|
<meta property="og:url" content="https://setto.basspistol.com/about/" />
|
||||||
<meta property="og:site_name" content="徒 setto セット" />
|
<meta property="og:site_name" content="徒 setto セット" />
|
||||||
<meta property="og:type" content="webpage" />
|
<meta property="og:type" content="webpage" />
|
||||||
<meta property="article:published_time" content="2020-07-27T10:30:14+00:00" />
|
<meta property="article:published_time" content="2020-08-05T17:06:29+00:00" />
|
||||||
<meta property="og:image" content="https://setto.basspistol.com/images/pages/shane-young-S7fRAd0oTPI-unsplash.jpg" />
|
<meta property="og:image" content="https://setto.basspistol.com/images/pages/creds.jpg" />
|
||||||
<!-- Twitter Card -->
|
<!-- Twitter Card -->
|
||||||
|
|
||||||
<meta name="twitter:card" content="summary" />
|
<meta name="twitter:card" content="summary" />
|
||||||
<meta name="twitter:title" content="About | 徒 setto セット" />
|
<meta name="twitter:title" content="About | 徒 setto セット" />
|
||||||
<meta name="twitter:description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
<meta name="twitter:description" content="WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?" />
|
||||||
<meta name="twitter:image" content="https://setto.basspistol.com/images/pages/shane-young-S7fRAd0oTPI-unsplash.jpg" />
|
<meta name="twitter:image" content="https://setto.basspistol.com/images/pages/creds.jpg" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
"https://twitter.com/ToSettoSetto","https://instagram.com/ToSettoSetto"
|
"https://twitter.com/ToSettoSetto","https://instagram.com/ToSettoSetto"
|
||||||
],
|
],
|
||||||
"logo": "https://setto.basspistol.com/siteicon.png",
|
"logo": "https://setto.basspistol.com/siteicon.png",
|
||||||
"image": "https://setto.basspistol.com/images/pages/shane-young-S7fRAd0oTPI-unsplash.jpg",
|
"image": "https://setto.basspistol.com/images/pages/creds.jpg",
|
||||||
"description": "Set, Party, Gang! &#35;Cybersoul.",
|
"description": "Set, Party, Gang! &#35;Cybersoul.",
|
||||||
"address": {
|
"address": {
|
||||||
"@type": "PostalAddress",
|
"@type": "PostalAddress",
|
||||||
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -132,7 +135,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<header class="hero" style="background-image: url(/images/pages/shane-young-S7fRAd0oTPI-unsplash.jpg);">
|
<header class="hero" style="background-image: url(/images/pages/creds.jpg);">
|
||||||
<div class="textcontainer">
|
<div class="textcontainer">
|
||||||
<h1>About</h1>
|
<h1>About</h1>
|
||||||
<p>WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?</p>
|
<p>WTF is 徒 setto セット and what does the funky characters mean? Why so cryptic and whodafuq?</p>
|
||||||
|
@ -244,7 +247,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -369,7 +372,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -388,7 +391,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -421,5 +424,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -326,7 +329,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -535,7 +538,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -554,7 +557,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -587,5 +590,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -376,7 +379,7 @@ Je yeuxt vers l'avant de temps en temps.
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -587,7 +590,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -606,7 +609,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -639,5 +642,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -406,7 +409,7 @@ Tu vas aussi kiffer
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -617,7 +620,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -636,7 +639,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -669,5 +672,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -336,7 +339,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -547,7 +550,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -566,7 +569,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -599,5 +602,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -336,7 +339,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -547,7 +550,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -566,7 +569,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -599,5 +602,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -329,7 +332,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -540,7 +543,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -559,7 +562,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -592,5 +595,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -395,7 +398,7 @@ WTF coucou
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -606,7 +609,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -625,7 +628,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -658,5 +661,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -370,7 +373,7 @@ Fois en moi, mais cette fois, toujours pas toi
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -581,7 +584,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -600,7 +603,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -633,5 +636,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -366,7 +369,7 @@ Sudo apt upgrade<br />
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -577,7 +580,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -596,7 +599,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -629,5 +632,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../../../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -349,7 +352,7 @@ This is what together we should refute.<br />
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -558,7 +561,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -577,7 +580,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -610,5 +613,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../../../assets/js/set-20200805.js"></script>
|
<script src="../../../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
BIN
android-icon-192x192-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
apple-icon-114x114-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
apple-icon-120x120-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
apple-icon-144x144-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
apple-icon-152x152-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
apple-icon-180x180-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
apple-icon-57x57-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
apple-icon-60x60-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
apple-icon-72x72-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
apple-icon-76x76-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
593
assets/js/workbox-v3.6.3/workbox-background-sync.dev.js
Normal file
|
@ -0,0 +1,593 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.backgroundSync = (function (DBWrapper_mjs,WorkboxError_mjs,logger_mjs,assert_mjs,getFriendlyURL_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:background-sync:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const serializableProperties = ['method', 'referrer', 'referrerPolicy', 'mode', 'credentials', 'cache', 'redirect', 'integrity', 'keepalive'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to make it easier to serialize and de-serialize requests so they
|
||||||
|
* can be stored in IndexedDB.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
class StorableRequest {
|
||||||
|
/**
|
||||||
|
* Converts a Request object to a plain object that can be structured
|
||||||
|
* cloned or JSON-stringified.
|
||||||
|
*
|
||||||
|
* @param {Request} request
|
||||||
|
* @return {Promise<StorableRequest>}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
static fromRequest(request) {
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const requestInit = { headers: {} };
|
||||||
|
|
||||||
|
// Set the body if present.
|
||||||
|
if (request.method !== 'GET') {
|
||||||
|
// Use blob to support non-text request bodies,
|
||||||
|
// and clone first in case the caller still needs the request.
|
||||||
|
requestInit.body = yield request.clone().blob();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the headers from an iterable to an object.
|
||||||
|
for (const [key, value] of request.headers.entries()) {
|
||||||
|
requestInit.headers[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add all other serializable request properties
|
||||||
|
for (const prop of serializableProperties) {
|
||||||
|
if (request[prop] !== undefined) {
|
||||||
|
requestInit[prop] = request[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StorableRequest({ url: request.url, requestInit });
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a URL and RequestInit dictionary that can be used to create a
|
||||||
|
* new Request object. A timestamp is also generated so consumers can
|
||||||
|
* reference when the object was created.
|
||||||
|
*
|
||||||
|
* @param {Object} param1
|
||||||
|
* @param {string} param1.url
|
||||||
|
* @param {Object} param1.requestInit
|
||||||
|
* See: https://fetch.spec.whatwg.org/#requestinit
|
||||||
|
* @param {number} param1.timestamp The time the request was created,
|
||||||
|
* defaulting to the current time if not specified.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
constructor({ url, requestInit, timestamp = Date.now() }) {
|
||||||
|
this.url = url;
|
||||||
|
this.requestInit = requestInit;
|
||||||
|
|
||||||
|
// "Private"
|
||||||
|
this._timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the private _timestamp property.
|
||||||
|
*
|
||||||
|
* @return {number}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
get timestamp() {
|
||||||
|
return this._timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coverts this instance to a plain Object.
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
toObject() {
|
||||||
|
return {
|
||||||
|
url: this.url,
|
||||||
|
timestamp: this.timestamp,
|
||||||
|
requestInit: this.requestInit
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts this instance to a Request.
|
||||||
|
*
|
||||||
|
* @return {Request}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
toRequest() {
|
||||||
|
return new Request(this.url, this.requestInit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns a deep clone of the instance.
|
||||||
|
*
|
||||||
|
* @return {StorableRequest}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
clone() {
|
||||||
|
const requestInit = Object.assign({}, this.requestInit);
|
||||||
|
requestInit.headers = Object.assign({}, this.requestInit.headers);
|
||||||
|
if (this.requestInit.body) {
|
||||||
|
requestInit.body = this.requestInit.body.slice();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StorableRequest({
|
||||||
|
url: this.url,
|
||||||
|
timestamp: this.timestamp,
|
||||||
|
requestInit
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const DB_NAME = 'workbox-background-sync';
|
||||||
|
const OBJECT_STORE_NAME = 'requests';
|
||||||
|
const INDEXED_PROP = 'queueName';
|
||||||
|
const TAG_PREFIX = 'workbox-background-sync';
|
||||||
|
const MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to manage storing requests from a Queue in IndexedbDB,
|
||||||
|
* indexed by their queue name for easier access.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
class QueueStore {
|
||||||
|
/**
|
||||||
|
* Associates this instance with a Queue instance, so entries added can be
|
||||||
|
* identified by their queue name.
|
||||||
|
*
|
||||||
|
* @param {Queue} queue
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
constructor(queue) {
|
||||||
|
this._queue = queue;
|
||||||
|
this._db = new DBWrapper_mjs.DBWrapper(DB_NAME, 1, {
|
||||||
|
onupgradeneeded: evt => evt.target.result.createObjectStore(OBJECT_STORE_NAME, { autoIncrement: true }).createIndex(INDEXED_PROP, INDEXED_PROP, { unique: false })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a StorableRequest instance, converts it to an object and adds it
|
||||||
|
* as an entry in the object store.
|
||||||
|
*
|
||||||
|
* @param {StorableRequest} storableRequest
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
addEntry(storableRequest) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
yield _this._db.add(OBJECT_STORE_NAME, {
|
||||||
|
queueName: _this._queue.name,
|
||||||
|
storableRequest: storableRequest.toObject()
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the oldest entry in the object store, removes it, and returns the
|
||||||
|
* value as a StorableRequest instance. If no entry exists, it returns
|
||||||
|
* undefined.
|
||||||
|
*
|
||||||
|
* @return {StorableRequest|undefined}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
getAndRemoveOldestEntry() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const [entry] = yield _this2._db.getAllMatching(OBJECT_STORE_NAME, {
|
||||||
|
index: INDEXED_PROP,
|
||||||
|
query: IDBKeyRange.only(_this2._queue.name),
|
||||||
|
count: 1,
|
||||||
|
includeKeys: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (entry) {
|
||||||
|
yield _this2._db.delete(OBJECT_STORE_NAME, entry.primaryKey);
|
||||||
|
return new StorableRequest(entry.value.storableRequest);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const queueNames = new Set();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to manage storing failed requests in IndexedDB and retrying them
|
||||||
|
* later. All parts of the storing and replaying process are observable via
|
||||||
|
* callbacks.
|
||||||
|
*
|
||||||
|
* @memberof workbox.backgroundSync
|
||||||
|
*/
|
||||||
|
class Queue {
|
||||||
|
/**
|
||||||
|
* Creates an instance of Queue with the given options
|
||||||
|
*
|
||||||
|
* @param {string} name The unique name for this queue. This name must be
|
||||||
|
* unique as it's used to register sync events and store requests
|
||||||
|
* in IndexedDB specific to this instance. An error will be thrown if
|
||||||
|
* a duplicate name is detected.
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @param {Object} [options.callbacks] Callbacks to observe the lifecycle of
|
||||||
|
* queued requests. Use these to respond to or modify the requests
|
||||||
|
* during the replay process.
|
||||||
|
* @param {function(StorableRequest):undefined}
|
||||||
|
* [options.callbacks.requestWillEnqueue]
|
||||||
|
* Invoked immediately before the request is stored to IndexedDB. Use
|
||||||
|
* this callback to modify request data at store time.
|
||||||
|
* @param {function(StorableRequest):undefined}
|
||||||
|
* [options.callbacks.requestWillReplay]
|
||||||
|
* Invoked immediately before the request is re-fetched. Use this
|
||||||
|
* callback to modify request data at fetch time.
|
||||||
|
* @param {function(Array<StorableRequest>):undefined}
|
||||||
|
* [options.callbacks.queueDidReplay]
|
||||||
|
* Invoked after all requests in the queue have successfully replayed.
|
||||||
|
* @param {number} [options.maxRetentionTime = 7 days] The amount of time (in
|
||||||
|
* minutes) a request may be retried. After this amount of time has
|
||||||
|
* passed, the request will be deleted from the queue.
|
||||||
|
*/
|
||||||
|
constructor(name, {
|
||||||
|
callbacks = {},
|
||||||
|
maxRetentionTime = MAX_RETENTION_TIME
|
||||||
|
} = {}) {
|
||||||
|
// Ensure the store name is not already being used
|
||||||
|
if (queueNames.has(name)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('duplicate-queue-name', { name });
|
||||||
|
} else {
|
||||||
|
queueNames.add(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._name = name;
|
||||||
|
this._callbacks = callbacks;
|
||||||
|
this._maxRetentionTime = maxRetentionTime;
|
||||||
|
this._queueStore = new QueueStore(this);
|
||||||
|
|
||||||
|
this._addSyncListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
get name() {
|
||||||
|
return this._name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores the passed request into IndexedDB. The database used is
|
||||||
|
* `workbox-background-sync` and the object store name is the same as
|
||||||
|
* the name this instance was created with (to guarantee it's unique).
|
||||||
|
*
|
||||||
|
* @param {Request} request The request object to store.
|
||||||
|
*/
|
||||||
|
addRequest(request) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(request, Request, {
|
||||||
|
moduleName: 'workbox-background-sync',
|
||||||
|
className: 'Queue',
|
||||||
|
funcName: 'addRequest',
|
||||||
|
paramName: 'request'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const storableRequest = yield StorableRequest.fromRequest(request.clone());
|
||||||
|
yield _this._runCallback('requestWillEnqueue', storableRequest);
|
||||||
|
yield _this._queueStore.addEntry(storableRequest);
|
||||||
|
yield _this._registerSync();
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}' has been
|
||||||
|
added to background sync queue '${_this._name}'.`);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all stored requests in IndexedDB and retries them. If the
|
||||||
|
* queue contained requests that were successfully replayed, the
|
||||||
|
* `queueDidReplay` callback is invoked (which implies the queue is
|
||||||
|
* now empty). If any of the requests fail, a new sync registration is
|
||||||
|
* created to retry again later.
|
||||||
|
*/
|
||||||
|
replayRequests() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const now = Date.now();
|
||||||
|
const replayedRequests = [];
|
||||||
|
const failedRequests = [];
|
||||||
|
|
||||||
|
let storableRequest;
|
||||||
|
while (storableRequest = yield _this2._queueStore.getAndRemoveOldestEntry()) {
|
||||||
|
// Make a copy so the unmodified request can be stored
|
||||||
|
// in the event of a replay failure.
|
||||||
|
const storableRequestClone = storableRequest.clone();
|
||||||
|
|
||||||
|
// Ignore requests older than maxRetentionTime.
|
||||||
|
const maxRetentionTimeInMs = _this2._maxRetentionTime * 60 * 1000;
|
||||||
|
if (now - storableRequest.timestamp > maxRetentionTimeInMs) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield _this2._runCallback('requestWillReplay', storableRequest);
|
||||||
|
|
||||||
|
const replay = { request: storableRequest.toRequest() };
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Clone the request before fetching so callbacks get an unused one.
|
||||||
|
replay.response = yield fetch(replay.request.clone());
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}'
|
||||||
|
has been replayed`);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}'
|
||||||
|
failed to replay`);
|
||||||
|
}
|
||||||
|
replay.error = err;
|
||||||
|
failedRequests.push(storableRequestClone);
|
||||||
|
}
|
||||||
|
|
||||||
|
replayedRequests.push(replay);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield _this2._runCallback('queueDidReplay', replayedRequests);
|
||||||
|
|
||||||
|
// If any requests failed, put the failed requests back in the queue
|
||||||
|
// and rethrow the failed requests count.
|
||||||
|
if (failedRequests.length) {
|
||||||
|
yield Promise.all(failedRequests.map(function (storableRequest) {
|
||||||
|
return _this2._queueStore.addEntry(storableRequest);
|
||||||
|
}));
|
||||||
|
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('queue-replay-failed', { name: _this2._name, count: failedRequests.length });
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the passed callback if it exists.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} name The name of the callback on this._callbacks.
|
||||||
|
* @param {...*} args The arguments to invoke the callback with.
|
||||||
|
*/
|
||||||
|
_runCallback(name, ...args) {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
if (typeof _this3._callbacks[name] === 'function') {
|
||||||
|
yield _this3._callbacks[name].apply(null, args);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In sync-supporting browsers, this adds a listener for the sync event.
|
||||||
|
* In non-sync-supporting browsers, this will retry the queue on service
|
||||||
|
* worker startup.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_addSyncListener() {
|
||||||
|
if ('sync' in registration) {
|
||||||
|
self.addEventListener('sync', event => {
|
||||||
|
if (event.tag === `${TAG_PREFIX}:${this._name}`) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Background sync for tag '${event.tag}'
|
||||||
|
has been received, starting replay now`);
|
||||||
|
}
|
||||||
|
event.waitUntil(this.replayRequests());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Background sync replaying without background sync event`);
|
||||||
|
}
|
||||||
|
// If the browser doesn't support background sync, retry
|
||||||
|
// every time the service worker starts up as a fallback.
|
||||||
|
this.replayRequests();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a sync event with a tag unique to this instance.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_registerSync() {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
if ('sync' in registration) {
|
||||||
|
try {
|
||||||
|
yield registration.sync.register(`${TAG_PREFIX}:${_this4._name}`);
|
||||||
|
} catch (err) {
|
||||||
|
// This means the registration failed for some reason, possibly due to
|
||||||
|
// the user disabling it.
|
||||||
|
{
|
||||||
|
logger_mjs.logger.warn(`Unable to register sync event for '${_this4._name}'.`, err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the set of queue names. This is primarily used to reset the list
|
||||||
|
* of queue names in tests.
|
||||||
|
*
|
||||||
|
* @return {Set}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
static get _queueNames() {
|
||||||
|
return queueNames;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class implementing the `fetchDidFail` lifecycle callback. This makes it
|
||||||
|
* easier to add failed requests to a background sync Queue.
|
||||||
|
*
|
||||||
|
* @memberof workbox.backgroundSync
|
||||||
|
*/
|
||||||
|
class Plugin {
|
||||||
|
/**
|
||||||
|
* @param {...*} queueArgs Args to forward to the composed Queue instance.
|
||||||
|
* See the [Queue]{@link workbox.backgroundSync.Queue} documentation for
|
||||||
|
* parameter details.
|
||||||
|
*/
|
||||||
|
constructor(...queueArgs) {
|
||||||
|
this._queue = new Queue(...queueArgs);
|
||||||
|
this.fetchDidFail = this.fetchDidFail.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Request} options.request
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
fetchDidFail({ request }) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
yield _this._queue.addRequest(request);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var publicAPI = /*#__PURE__*/Object.freeze({
|
||||||
|
Queue: Queue,
|
||||||
|
Plugin: Plugin
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
return publicAPI;
|
||||||
|
|
||||||
|
}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-background-sync.dev.js.map
|
3
assets/js/workbox-v3.6.3/workbox-background-sync.prod.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.backgroundSync=function(e,t){"use strict";try{self.workbox.v["workbox:background-sync:3.6.3"]=1}catch(e){}const r=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class s{static fromRequest(e){return babelHelpers.asyncToGenerator(function*(){const t={headers:{}};"GET"!==e.method&&(t.body=yield e.clone().blob());for(const[r,s]of e.headers.entries())t.headers[r]=s;for(const s of r)void 0!==e[s]&&(t[s]=e[s]);return new s({url:e.url,requestInit:t})})()}constructor({url:e,requestInit:t,timestamp:r=Date.now()}){this.url=e,this.requestInit=t,this.e=r}get timestamp(){return this.e}toObject(){return{url:this.url,timestamp:this.timestamp,requestInit:this.requestInit}}toRequest(){return new Request(this.url,this.requestInit)}clone(){const e=Object.assign({},this.requestInit);return e.headers=Object.assign({},this.requestInit.headers),this.requestInit.body&&(e.body=this.requestInit.body.slice()),new s({url:this.url,timestamp:this.timestamp,requestInit:e})}}const i="workbox-background-sync",n="requests",u="queueName",c="workbox-background-sync",o=10080;class l{constructor(t){this.t=t,this.r=new e.DBWrapper(i,1,{onupgradeneeded:e=>e.target.result.createObjectStore(n,{autoIncrement:!0}).createIndex(u,u,{unique:!1})})}addEntry(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.add(n,{queueName:t.t.name,storableRequest:e.toObject()})})()}getAndRemoveOldestEntry(){var e=this;return babelHelpers.asyncToGenerator(function*(){const[t]=yield e.r.getAllMatching(n,{index:u,query:IDBKeyRange.only(e.t.name),count:1,includeKeys:!0});if(t)return yield e.r.delete(n,t.primaryKey),new s(t.value.storableRequest)})()}}const a=new Set;class h{constructor(e,{callbacks:r={},maxRetentionTime:s=o}={}){if(a.has(e))throw new t.WorkboxError("duplicate-queue-name",{name:e});a.add(e),this.s=e,this.i=r,this.n=s,this.u=new l(this),this.c()}get name(){return this.s}addRequest(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield s.fromRequest(e.clone());yield t.o("requestWillEnqueue",r),yield t.u.addEntry(r),yield t.l()})()}replayRequests(){var e=this;return babelHelpers.asyncToGenerator(function*(){const r=Date.now(),s=[],i=[];let n;for(;n=yield e.u.getAndRemoveOldestEntry();){const t=n.clone(),u=60*e.n*1e3;if(r-n.timestamp>u)continue;yield e.o("requestWillReplay",n);const c={request:n.toRequest()};try{c.response=yield fetch(c.request.clone())}catch(e){c.error=e,i.push(t)}s.push(c)}if(yield e.o("queueDidReplay",s),i.length)throw yield Promise.all(i.map(function(t){return e.u.addEntry(t)})),new t.WorkboxError("queue-replay-failed",{name:e.s,count:i.length})})()}o(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){"function"==typeof r.i[e]&&(yield r.i[e].apply(null,t))})()}c(){"sync"in registration?self.addEventListener("sync",e=>{e.tag===`${c}:${this.s}`&&e.waitUntil(this.replayRequests())}):this.replayRequests()}l(){var e=this;return babelHelpers.asyncToGenerator(function*(){if("sync"in registration)try{yield registration.sync.register(`${c}:${e.s}`)}catch(e){}})()}static get a(){return a}}return Object.freeze({Queue:h,Plugin:class{constructor(...e){this.t=new h(...e),this.fetchDidFail=this.fetchDidFail.bind(this)}fetchDidFail({request:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.t.addRequest(e)})()}}})}(workbox.core._private,workbox.core._private);
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-background-sync.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-background-sync/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.backgroundSync=function(e,t){\"use strict\";try{self.workbox.v[\"workbox:background-sync:3.6.3\"]=1}catch(e){}const r=[\"method\",\"referrer\",\"referrerPolicy\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"integrity\",\"keepalive\"];class s{static fromRequest(e){return babelHelpers.asyncToGenerator(function*(){const t={headers:{}};\"GET\"!==e.method&&(t.body=yield e.clone().blob());for(const[r,s]of e.headers.entries())t.headers[r]=s;for(const s of r)void 0!==e[s]&&(t[s]=e[s]);return new s({url:e.url,requestInit:t})})()}constructor({url:e,requestInit:t,timestamp:r=Date.now()}){this.url=e,this.requestInit=t,this.e=r}get timestamp(){return this.e}toObject(){return{url:this.url,timestamp:this.timestamp,requestInit:this.requestInit}}toRequest(){return new Request(this.url,this.requestInit)}clone(){const e=Object.assign({},this.requestInit);return e.headers=Object.assign({},this.requestInit.headers),this.requestInit.body&&(e.body=this.requestInit.body.slice()),new s({url:this.url,timestamp:this.timestamp,requestInit:e})}}const i=\"workbox-background-sync\",n=\"requests\",u=\"queueName\",c=\"workbox-background-sync\",o=10080;class l{constructor(t){this.t=t,this.r=new e.DBWrapper(i,1,{onupgradeneeded:e=>e.target.result.createObjectStore(n,{autoIncrement:!0}).createIndex(u,u,{unique:!1})})}addEntry(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.add(n,{queueName:t.t.name,storableRequest:e.toObject()})})()}getAndRemoveOldestEntry(){var e=this;return babelHelpers.asyncToGenerator(function*(){const[t]=yield e.r.getAllMatching(n,{index:u,query:IDBKeyRange.only(e.t.name),count:1,includeKeys:!0});if(t)return yield e.r.delete(n,t.primaryKey),new s(t.value.storableRequest)})()}}const a=new Set;class h{constructor(e,{callbacks:r={},maxRetentionTime:s=o}={}){if(a.has(e))throw new t.WorkboxError(\"duplicate-queue-name\",{name:e});a.add(e),this.s=e,this.i=r,this.n=s,this.u=new l(this),this.c()}get name(){return this.s}addRequest(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield s.fromRequest(e.clone());yield t.o(\"requestWillEnqueue\",r),yield t.u.addEntry(r),yield t.l()})()}replayRequests(){var e=this;return babelHelpers.asyncToGenerator(function*(){const r=Date.now(),s=[],i=[];let n;for(;n=yield e.u.getAndRemoveOldestEntry();){const t=n.clone(),u=60*e.n*1e3;if(r-n.timestamp>u)continue;yield e.o(\"requestWillReplay\",n);const c={request:n.toRequest()};try{c.response=yield fetch(c.request.clone())}catch(e){c.error=e,i.push(t)}s.push(c)}if(yield e.o(\"queueDidReplay\",s),i.length)throw yield Promise.all(i.map(function(t){return e.u.addEntry(t)})),new t.WorkboxError(\"queue-replay-failed\",{name:e.s,count:i.length})})()}o(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){\"function\"==typeof r.i[e]&&(yield r.i[e].apply(null,t))})()}c(){\"sync\"in registration?self.addEventListener(\"sync\",e=>{e.tag===`${c}:${this.s}`&&e.waitUntil(this.replayRequests())}):this.replayRequests()}l(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(\"sync\"in registration)try{yield registration.sync.register(`${c}:${e.s}`)}catch(e){}})()}static get a(){return a}}return Object.freeze({Queue:h,Plugin:class{constructor(...e){this.t=new h(...e),this.fetchDidFail=this.fetchDidFail.bind(this)}fetchDidFail({request:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.t.addRequest(e)})()}}})}(workbox.core._private,workbox.core._private);\n"],"file":"workbox-background-sync.prod.js"}
|
395
assets/js/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js
Normal file
|
@ -0,0 +1,395 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.broadcastUpdate = (function (exports,WorkboxError_mjs,logger_mjs,assert_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:broadcast-cache-update:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given two `Response's`, compares several header values to see if they are
|
||||||
|
* the same or not.
|
||||||
|
*
|
||||||
|
* @param {Response} firstResponse
|
||||||
|
* @param {Response} secondResponse
|
||||||
|
* @param {Array<string>} headersToCheck
|
||||||
|
* @return {boolean}
|
||||||
|
*
|
||||||
|
* @memberof workbox.broadcastUpdate
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {
|
||||||
|
{
|
||||||
|
if (!(firstResponse instanceof Response && secondResponse instanceof Response)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('invalid-responses-are-same-args');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const atLeastOneHeaderAvailable = headersToCheck.some(header => {
|
||||||
|
return firstResponse.headers.has(header) && secondResponse.headers.has(header);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!atLeastOneHeaderAvailable) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.warn(`Unable to determine where the response has been updated ` + `because none of the headers that would be checked are present.`);
|
||||||
|
logger_mjs.logger.debug(`Attempting to compare the following: `, firstResponse, secondResponse, headersToCheck);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just return true, indicating the that responses are the same, since we
|
||||||
|
// can't determine otherwise.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return headersToCheck.every(header => {
|
||||||
|
const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header);
|
||||||
|
const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header);
|
||||||
|
|
||||||
|
return headerStateComparison && headerValueComparison;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var messageTypes = {
|
||||||
|
CACHE_UPDATED: 'CACHE_UPDATED'
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You would not normally call this method directly; it's called automatically
|
||||||
|
* by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here
|
||||||
|
* for the benefit of developers who would rather not use the full
|
||||||
|
* `BroadcastCacheUpdate` implementation.
|
||||||
|
*
|
||||||
|
* Calling this will dispatch a message on the provided
|
||||||
|
* {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}
|
||||||
|
* to notify interested subscribers about a change to a cached resource.
|
||||||
|
*
|
||||||
|
* The message that's posted has a formation inspired by the
|
||||||
|
* [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)
|
||||||
|
* format like so:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* {
|
||||||
|
* type: 'CACHE_UPDATED',
|
||||||
|
* meta: 'workbox-broadcast-cache-update',
|
||||||
|
* payload: {
|
||||||
|
* cacheName: 'the-cache-name',
|
||||||
|
* updatedUrl: 'https://example.com/'
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* (Usage of [Flux](https://facebook.github.io/flux/) itself is not at
|
||||||
|
* all required.)
|
||||||
|
*
|
||||||
|
* @param {BroadcastChannel} channel The `BroadcastChannel` to use.
|
||||||
|
* @param {string} cacheName The name of the cache in which the updated
|
||||||
|
* `Response` was stored.
|
||||||
|
* @param {string} url The URL associated with the updated `Response`.
|
||||||
|
* @param {string} source A string identifying this library as the source
|
||||||
|
* of the update message.
|
||||||
|
*
|
||||||
|
* @memberof workbox.broadcastUpdate
|
||||||
|
*/
|
||||||
|
const broadcastUpdate = (channel, cacheName, url, source) => {
|
||||||
|
// There are browsers which support service workers but don't support the
|
||||||
|
// Broadcast Channel API.
|
||||||
|
// See https://github.com/GoogleChrome/workbox/issues/1304
|
||||||
|
if (!('BroadcastChannel' in self && channel)) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`${url} was updated, but the Broadcast Channel API is not ` + `available in the current browser.`);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(channel, BroadcastChannel, {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: '~',
|
||||||
|
funcName: 'broadcastUpdate',
|
||||||
|
paramName: 'channel'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isType(cacheName, 'string', {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: '~',
|
||||||
|
funcName: 'broadcastUpdate',
|
||||||
|
paramName: 'cacheName'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isType(url, 'string', {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: '~',
|
||||||
|
funcName: 'broadcastUpdate',
|
||||||
|
paramName: 'url'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isType(source, 'string', {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: '~',
|
||||||
|
funcName: 'broadcastUpdate',
|
||||||
|
paramName: 'source'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
channel.postMessage({
|
||||||
|
type: messageTypes.CACHE_UPDATED,
|
||||||
|
meta: source,
|
||||||
|
payload: {
|
||||||
|
cacheName: cacheName,
|
||||||
|
updatedUrl: url
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}
|
||||||
|
* to notify interested parties when a cached response has been updated.
|
||||||
|
*
|
||||||
|
* For efficiency's sake, the underlying response bodies are not compared;
|
||||||
|
* only specific response headers are checked.
|
||||||
|
*
|
||||||
|
* @memberof workbox.broadcastUpdate
|
||||||
|
*/
|
||||||
|
class BroadcastCacheUpdate {
|
||||||
|
/**
|
||||||
|
* Construct a BroadcastCacheUpdate instance with a specific `channelName` to
|
||||||
|
* broadcast messages on
|
||||||
|
*
|
||||||
|
* @param {string} channelName The name that will be used when creating
|
||||||
|
* the `BroadcastChannel`.
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Array<string>}
|
||||||
|
* [options.headersToCheck=['content-length', 'etag', 'last-modified']] A
|
||||||
|
* list of headers that will be used to determine whether the responses
|
||||||
|
* differ.
|
||||||
|
* @param {string} [options.source='workbox-broadcast-cache-update'] An
|
||||||
|
* attribution value that indicates where the update originated.
|
||||||
|
*/
|
||||||
|
constructor(channelName, { headersToCheck, source } = {}) {
|
||||||
|
{
|
||||||
|
if (typeof channelName !== 'string' || channelName.length === 0) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('channel-name-required');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._channelName = channelName;
|
||||||
|
this._headersToCheck = headersToCheck || ['content-length', 'etag', 'last-modified'];
|
||||||
|
this._source = source || 'workbox-broadcast-cache-update';
|
||||||
|
|
||||||
|
// TODO assert typeof headersToCheck instanceof Array
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {BroadcastChannel|undefined} The BroadcastChannel instance used for
|
||||||
|
* broadcasting updates, or undefined if the browser doesn't support the
|
||||||
|
* Broadcast Channel API.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_getChannel() {
|
||||||
|
if ('BroadcastChannel' in self && !this._channel) {
|
||||||
|
this._channel = new BroadcastChannel(this._channelName);
|
||||||
|
}
|
||||||
|
return this._channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)
|
||||||
|
* and send a message via the
|
||||||
|
* {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}
|
||||||
|
* if they differ.
|
||||||
|
*
|
||||||
|
* Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.
|
||||||
|
*
|
||||||
|
* @param {Response} firstResponse First responses to compare.
|
||||||
|
* @param {Response} secondResponse Second responses to compare.
|
||||||
|
* @param {string} url The URL of the updated request.
|
||||||
|
* @param {string} cacheName Name of the cache the responses belong to.
|
||||||
|
* This is included in the message posted on the broadcast channel.
|
||||||
|
*/
|
||||||
|
notifyIfUpdated(firstResponse, secondResponse, url, cacheName) {
|
||||||
|
if (!responsesAreSame(firstResponse, secondResponse, this._headersToCheck)) {
|
||||||
|
broadcastUpdate(this._getChannel(), cacheName, url, this._source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This plugin will automatically broadcast a message whenever a cached response
|
||||||
|
* is updated.
|
||||||
|
*
|
||||||
|
* @memberof workbox.broadcastUpdate
|
||||||
|
*/
|
||||||
|
class Plugin {
|
||||||
|
/**
|
||||||
|
* Construct a new instance with a specific `channelName` to
|
||||||
|
* broadcast messages on
|
||||||
|
*
|
||||||
|
* @param {string} channelName The name that will be used when creating
|
||||||
|
* the `BroadcastChannel`.
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Array<string>}
|
||||||
|
* [options.headersToCheck=['content-length', 'etag', 'last-modified']] A
|
||||||
|
* list of headers that will be used to determine whether the responses
|
||||||
|
* differ.
|
||||||
|
* @param {string} [options.source='workbox-broadcast-cache-update'] An
|
||||||
|
* attribution value that indicates where the update originated.
|
||||||
|
*/
|
||||||
|
constructor(channelName, options) {
|
||||||
|
this._broadcastUpdate = new BroadcastCacheUpdate(channelName, options);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A "lifecycle" callback that will be triggered automatically by the
|
||||||
|
* `workbox-sw` and `workbox-runtime-caching` handlers when an entry is
|
||||||
|
* added to a cache.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Object} options The input object to this function.
|
||||||
|
* @param {string} options.cacheName Name of the cache being updated.
|
||||||
|
* @param {Response} [options.oldResponse] The previous cached value, if any.
|
||||||
|
* @param {Response} options.newResponse The new value in the cache.
|
||||||
|
*/
|
||||||
|
cacheDidUpdate({ cacheName, oldResponse, newResponse, request }) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(cacheName, 'string', {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'cacheDidUpdate',
|
||||||
|
paramName: 'cacheName'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isInstance(newResponse, Response, {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'cacheDidUpdate',
|
||||||
|
paramName: 'newResponse'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isInstance(request, Request, {
|
||||||
|
moduleName: 'workbox-broadcast-cache-update',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'cacheDidUpdate',
|
||||||
|
paramName: 'request'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!oldResponse) {
|
||||||
|
// Without a two responses there is nothing to compare.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._broadcastUpdate.notifyIfUpdated(oldResponse, newResponse, request.url, cacheName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.BroadcastCacheUpdate = BroadcastCacheUpdate;
|
||||||
|
exports.Plugin = Plugin;
|
||||||
|
exports.broadcastUpdate = broadcastUpdate;
|
||||||
|
exports.messageTypes = messageTypes;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private,workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-broadcast-cache-update.dev.js.map
|
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(t){"use strict";try{self.workbox.v["workbox:broadcast-cache-update:3.6.3"]=1}catch(t){}const e=(t,e,s)=>{return!s.some(s=>t.headers.has(s)&&e.headers.has(s))||s.every(s=>{const a=t.headers.has(s)===e.headers.has(s),n=t.headers.get(s)===e.headers.get(s);return a&&n})};var s={CACHE_UPDATED:"CACHE_UPDATED"};const a=(t,e,a,n)=>{"BroadcastChannel"in self&&t&&t.postMessage({type:s.CACHE_UPDATED,meta:n,payload:{cacheName:e,updatedUrl:a}})};class n{constructor(t,{headersToCheck:e,source:s}={}){this.t=t,this.e=e||["content-length","etag","last-modified"],this.s=s||"workbox-broadcast-cache-update"}a(){return"BroadcastChannel"in self&&!this.n&&(this.n=new BroadcastChannel(this.t)),this.n}notifyIfUpdated(t,s,n,c){e(t,s,this.e)||a(this.a(),c,n,this.s)}}return t.BroadcastCacheUpdate=n,t.Plugin=class{constructor(t,e){this.c=new n(t,e)}cacheDidUpdate({cacheName:t,oldResponse:e,newResponse:s,request:a}){e&&this.c.notifyIfUpdated(e,s,a.url,t)}},t.broadcastUpdate=a,t.messageTypes=s,t}({});
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-broadcast-cache-update.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-broadcast-cache-update/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(t){\"use strict\";try{self.workbox.v[\"workbox:broadcast-cache-update:3.6.3\"]=1}catch(t){}const e=(t,e,s)=>{return!s.some(s=>t.headers.has(s)&&e.headers.has(s))||s.every(s=>{const a=t.headers.has(s)===e.headers.has(s),n=t.headers.get(s)===e.headers.get(s);return a&&n})};var s={CACHE_UPDATED:\"CACHE_UPDATED\"};const a=(t,e,a,n)=>{\"BroadcastChannel\"in self&&t&&t.postMessage({type:s.CACHE_UPDATED,meta:n,payload:{cacheName:e,updatedUrl:a}})};class n{constructor(t,{headersToCheck:e,source:s}={}){this.t=t,this.e=e||[\"content-length\",\"etag\",\"last-modified\"],this.s=s||\"workbox-broadcast-cache-update\"}a(){return\"BroadcastChannel\"in self&&!this.n&&(this.n=new BroadcastChannel(this.t)),this.n}notifyIfUpdated(t,s,n,c){e(t,s,this.e)||a(this.a(),c,n,this.s)}}return t.BroadcastCacheUpdate=n,t.Plugin=class{constructor(t,e){this.c=new n(t,e)}cacheDidUpdate({cacheName:t,oldResponse:e,newResponse:s,request:a}){e&&this.c.notifyIfUpdated(e,s,a.url,t)}},t.broadcastUpdate=a,t.messageTypes=s,t}({});\n"],"file":"workbox-broadcast-cache-update.prod.js"}
|
740
assets/js/workbox-v3.6.3/workbox-cache-expiration.dev.js
Normal file
|
@ -0,0 +1,740 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.expiration = (function (exports,DBWrapper_mjs,WorkboxError_mjs,assert_mjs,logger_mjs,cacheNames_mjs,index_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:cache-expiration:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const URL_KEY = 'url';
|
||||||
|
const TIMESTAMP_KEY = 'timestamp';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the timestamp model.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
class CacheTimestampsModel {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} cacheName
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
constructor(cacheName) {
|
||||||
|
// TODO Check cacheName
|
||||||
|
|
||||||
|
this._cacheName = cacheName;
|
||||||
|
this._storeName = cacheName;
|
||||||
|
|
||||||
|
this._db = new DBWrapper_mjs.DBWrapper(this._cacheName, 2, {
|
||||||
|
onupgradeneeded: evt => this._handleUpgrade(evt)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should perform an upgrade of indexedDB.
|
||||||
|
*
|
||||||
|
* @param {Event} evt
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_handleUpgrade(evt) {
|
||||||
|
const db = evt.target.result;
|
||||||
|
if (evt.oldVersion < 2) {
|
||||||
|
// Remove old databases.
|
||||||
|
if (db.objectStoreNames.contains('workbox-cache-expiration')) {
|
||||||
|
db.deleteObjectStore('workbox-cache-expiration');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
db.createObjectStore(this._storeName, { keyPath: URL_KEY }).createIndex(TIMESTAMP_KEY, TIMESTAMP_KEY, { unique: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} url
|
||||||
|
* @param {number} timestamp
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
setTimestamp(url, timestamp) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
yield _this._db.put(_this._storeName, {
|
||||||
|
[URL_KEY]: new URL(url, location).href,
|
||||||
|
[TIMESTAMP_KEY]: timestamp
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all of the timestamps in the indexedDB.
|
||||||
|
*
|
||||||
|
* @return {Array<Objects>}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
getAllTimestamps() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
return yield _this2._db.getAllMatching(_this2._storeName, {
|
||||||
|
index: TIMESTAMP_KEY
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the timestamp stored for a given URL.
|
||||||
|
*
|
||||||
|
* @param {string} url
|
||||||
|
* @return {number}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
getTimestamp(url) {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const timestampObject = yield _this3._db.get(_this3._storeName, url);
|
||||||
|
return timestampObject.timestamp;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} url
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
deleteUrl(url) {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
yield _this4._db.delete(_this4._storeName, new URL(url, location).href);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the underlying IndexedDB object store entirely.
|
||||||
|
*/
|
||||||
|
delete() {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
yield _this5._db.deleteDatabase();
|
||||||
|
_this5._db = null;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `CacheExpiration` class allows you define an expiration and / or
|
||||||
|
* limit on the number of responses stored in a
|
||||||
|
* [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).
|
||||||
|
*
|
||||||
|
* @memberof workbox.expiration
|
||||||
|
*/
|
||||||
|
class CacheExpiration {
|
||||||
|
/**
|
||||||
|
* To construct a new CacheExpiration instance you must provide at least
|
||||||
|
* one of the `config` properties.
|
||||||
|
*
|
||||||
|
* @param {string} cacheName Name of the cache to apply restrictions to.
|
||||||
|
* @param {Object} config
|
||||||
|
* @param {number} [config.maxEntries] The maximum number of entries to cache.
|
||||||
|
* Entries used the least will be removed as the maximum is reached.
|
||||||
|
* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
|
||||||
|
* it's treated as stale and removed.
|
||||||
|
*/
|
||||||
|
constructor(cacheName, config = {}) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(cacheName, 'string', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'cacheName'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!(config.maxEntries || config.maxAgeSeconds)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: 'constructor'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.maxEntries) {
|
||||||
|
assert_mjs.assert.isType(config.maxEntries, 'number', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.maxEntries'
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: Assert is positive
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.maxAgeSeconds) {
|
||||||
|
assert_mjs.assert.isType(config.maxAgeSeconds, 'number', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.maxAgeSeconds'
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: Assert is positive
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isRunning = false;
|
||||||
|
this._rerunRequested = false;
|
||||||
|
this._maxEntries = config.maxEntries;
|
||||||
|
this._maxAgeSeconds = config.maxAgeSeconds;
|
||||||
|
this._cacheName = cacheName;
|
||||||
|
this._timestampModel = new CacheTimestampsModel(cacheName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expires entries for the given cache and given criteria.
|
||||||
|
*/
|
||||||
|
expireEntries() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
if (_this._isRunning) {
|
||||||
|
_this._rerunRequested = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_this._isRunning = true;
|
||||||
|
|
||||||
|
const now = Date.now();
|
||||||
|
|
||||||
|
// First, expire old entries, if maxAgeSeconds is set.
|
||||||
|
const oldEntries = yield _this._findOldEntries(now);
|
||||||
|
|
||||||
|
// Once that's done, check for the maximum size.
|
||||||
|
const extraEntries = yield _this._findExtraEntries();
|
||||||
|
|
||||||
|
// Use a Set to remove any duplicates following the concatenation, then
|
||||||
|
// convert back into an array.
|
||||||
|
const allUrls = [...new Set(oldEntries.concat(extraEntries))];
|
||||||
|
|
||||||
|
yield Promise.all([_this._deleteFromCache(allUrls), _this._deleteFromIDB(allUrls)]);
|
||||||
|
|
||||||
|
{
|
||||||
|
// TODO: break apart entries deleted due to expiration vs size restraints
|
||||||
|
if (allUrls.length > 0) {
|
||||||
|
logger_mjs.logger.groupCollapsed(`Expired ${allUrls.length} ` + `${allUrls.length === 1 ? 'entry' : 'entries'} and removed ` + `${allUrls.length === 1 ? 'it' : 'them'} from the ` + `'${_this._cacheName}' cache.`);
|
||||||
|
logger_mjs.logger.log(`Expired the following ${allUrls.length === 1 ? 'URL' : 'URLs'}:`);
|
||||||
|
allUrls.forEach(function (url) {
|
||||||
|
return logger_mjs.logger.log(` ${url}`);
|
||||||
|
});
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
} else {
|
||||||
|
logger_mjs.logger.debug(`Cache expiration ran and found no entries to remove.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_this._isRunning = false;
|
||||||
|
if (_this._rerunRequested) {
|
||||||
|
_this._rerunRequested = false;
|
||||||
|
_this.expireEntries();
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expires entries based on the maximum age.
|
||||||
|
*
|
||||||
|
* @param {number} expireFromTimestamp A timestamp.
|
||||||
|
* @return {Promise<Array<string>>} A list of the URLs that were expired.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_findOldEntries(expireFromTimestamp) {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(expireFromTimestamp, 'number', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: '_findOldEntries',
|
||||||
|
paramName: 'expireFromTimestamp'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_this2._maxAgeSeconds) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const expireOlderThan = expireFromTimestamp - _this2._maxAgeSeconds * 1000;
|
||||||
|
const timestamps = yield _this2._timestampModel.getAllTimestamps();
|
||||||
|
const expiredUrls = [];
|
||||||
|
timestamps.forEach(function (timestampDetails) {
|
||||||
|
if (timestampDetails.timestamp < expireOlderThan) {
|
||||||
|
expiredUrls.push(timestampDetails.url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return expiredUrls;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {Promise<Array>}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_findExtraEntries() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const extraUrls = [];
|
||||||
|
|
||||||
|
if (!_this3._maxEntries) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const timestamps = yield _this3._timestampModel.getAllTimestamps();
|
||||||
|
while (timestamps.length > _this3._maxEntries) {
|
||||||
|
const lastUsed = timestamps.shift();
|
||||||
|
extraUrls.push(lastUsed.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return extraUrls;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array<string>} urls Array of URLs to delete from cache.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_deleteFromCache(urls) {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
const cache = yield caches.open(_this4._cacheName);
|
||||||
|
for (const url of urls) {
|
||||||
|
yield cache.delete(url);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array<string>} urls Array of URLs to delete from IDB
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_deleteFromIDB(urls) {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
for (const url of urls) {
|
||||||
|
yield _this5._timestampModel.deleteUrl(url);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the timestamp for the given URL. This ensures the when
|
||||||
|
* removing entries based on maximum entries, most recently used
|
||||||
|
* is accurate or when expiring, the timestamp is up-to-date.
|
||||||
|
*
|
||||||
|
* @param {string} url
|
||||||
|
*/
|
||||||
|
updateTimestamp(url) {
|
||||||
|
var _this6 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(url, 'string', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'CacheExpiration',
|
||||||
|
funcName: 'updateTimestamp',
|
||||||
|
paramName: 'url'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const urlObject = new URL(url, location);
|
||||||
|
urlObject.hash = '';
|
||||||
|
|
||||||
|
yield _this6._timestampModel.setTimestamp(urlObject.href, Date.now());
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used to check if a URL has expired or not before it's used.
|
||||||
|
*
|
||||||
|
* This requires a look up from IndexedDB, so can be slow.
|
||||||
|
*
|
||||||
|
* Note: This method will not remove the cached entry, call
|
||||||
|
* `expireEntries()` to remove indexedDB and Cache entries.
|
||||||
|
*
|
||||||
|
* @param {string} url
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
isURLExpired(url) {
|
||||||
|
var _this7 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
if (!_this7._maxAgeSeconds) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError(`expired-test-without-max-age`, {
|
||||||
|
methodName: 'isURLExpired',
|
||||||
|
paramName: 'maxAgeSeconds'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const urlObject = new URL(url, location);
|
||||||
|
urlObject.hash = '';
|
||||||
|
|
||||||
|
const timestamp = yield _this7._timestampModel.getTimestamp(urlObject.href);
|
||||||
|
const expireOlderThan = Date.now() - _this7._maxAgeSeconds * 1000;
|
||||||
|
return timestamp < expireOlderThan;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the IndexedDB object store used to keep track of cache expiration
|
||||||
|
* metadata.
|
||||||
|
*/
|
||||||
|
delete() {
|
||||||
|
var _this8 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
// Make sure we don't attempt another rerun if we're called in the middle of
|
||||||
|
// a cache expiration.
|
||||||
|
_this8._rerunRequested = false;
|
||||||
|
yield _this8._timestampModel.delete();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This plugin can be used in the Workbox APIs to regularly enforce a
|
||||||
|
* limit on the age and / or the number of cached requests.
|
||||||
|
*
|
||||||
|
* Whenever a cached request is used or updated, this plugin will look
|
||||||
|
* at the used Cache and remove any old or extra requests.
|
||||||
|
*
|
||||||
|
* When using `maxAgeSeconds`, requests may be used *once* after expiring
|
||||||
|
* because the expiration clean up will not have occurred until *after* the
|
||||||
|
* cached request has been used. If the request has a "Date" header, then
|
||||||
|
* a light weight expiration check is performed and the request will not be
|
||||||
|
* used immediately.
|
||||||
|
*
|
||||||
|
* When using `maxEntries`, the last request to be used will be the request
|
||||||
|
* that is removed from the Cache.
|
||||||
|
*
|
||||||
|
* @memberof workbox.expiration
|
||||||
|
*/
|
||||||
|
class Plugin {
|
||||||
|
/**
|
||||||
|
* @param {Object} config
|
||||||
|
* @param {number} [config.maxEntries] The maximum number of entries to cache.
|
||||||
|
* Entries used the least will be removed as the maximum is reached.
|
||||||
|
* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
|
||||||
|
* it's treated as stale and removed.
|
||||||
|
* @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to
|
||||||
|
* automatic deletion if the available storage quota has been exceeded.
|
||||||
|
*/
|
||||||
|
constructor(config = {}) {
|
||||||
|
{
|
||||||
|
if (!(config.maxEntries || config.maxAgeSeconds)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'constructor'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.maxEntries) {
|
||||||
|
assert_mjs.assert.isType(config.maxEntries, 'number', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.maxEntries'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.maxAgeSeconds) {
|
||||||
|
assert_mjs.assert.isType(config.maxAgeSeconds, 'number', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.maxAgeSeconds'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._config = config;
|
||||||
|
this._maxAgeSeconds = config.maxAgeSeconds;
|
||||||
|
this._cacheExpirations = new Map();
|
||||||
|
|
||||||
|
if (config.purgeOnQuotaError) {
|
||||||
|
index_mjs.registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple helper method to return a CacheExpiration instance for a given
|
||||||
|
* cache name.
|
||||||
|
*
|
||||||
|
* @param {string} cacheName
|
||||||
|
* @return {CacheExpiration}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_getCacheExpiration(cacheName) {
|
||||||
|
if (cacheName === cacheNames_mjs.cacheNames.getRuntimeName()) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('expire-custom-caches-only');
|
||||||
|
}
|
||||||
|
|
||||||
|
let cacheExpiration = this._cacheExpirations.get(cacheName);
|
||||||
|
if (!cacheExpiration) {
|
||||||
|
cacheExpiration = new CacheExpiration(cacheName, this._config);
|
||||||
|
this._cacheExpirations.set(cacheName, cacheExpiration);
|
||||||
|
}
|
||||||
|
return cacheExpiration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A "lifecycle" callback that will be triggered automatically by the
|
||||||
|
* `workbox.runtimeCaching` handlers when a `Response` is about to be returned
|
||||||
|
* from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to
|
||||||
|
* the handler. It allows the `Response` to be inspected for freshness and
|
||||||
|
* prevents it from being used if the `Response`'s `Date` header value is
|
||||||
|
* older than the configured `maxAgeSeconds`.
|
||||||
|
*
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {string} options.cacheName Name of the cache the response is in.
|
||||||
|
* @param {Response} options.cachedResponse The `Response` object that's been
|
||||||
|
* read from a cache and whose freshness should be checked.
|
||||||
|
* @return {Response} Either the `cachedResponse`, if it's
|
||||||
|
* fresh, or `null` if the `Response` is older than `maxAgeSeconds`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
cachedResponseWillBeUsed({ cacheName, cachedResponse }) {
|
||||||
|
if (!cachedResponse) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let isFresh = this._isResponseDateFresh(cachedResponse);
|
||||||
|
|
||||||
|
// Expire entries to ensure that even if the expiration date has
|
||||||
|
// expired, it'll only be used once.
|
||||||
|
const cacheExpiration = this._getCacheExpiration(cacheName);
|
||||||
|
cacheExpiration.expireEntries();
|
||||||
|
|
||||||
|
return isFresh ? cachedResponse : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Response} cachedResponse
|
||||||
|
* @return {boolean}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_isResponseDateFresh(cachedResponse) {
|
||||||
|
if (!this._maxAgeSeconds) {
|
||||||
|
// We aren't expiring by age, so return true, it's fresh
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the 'date' header will suffice a quick expiration check.
|
||||||
|
// See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for
|
||||||
|
// discussion.
|
||||||
|
const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);
|
||||||
|
if (dateHeaderTimestamp === null) {
|
||||||
|
// Unable to parse date, so assume it's fresh.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have a valid headerTime, then our response is fresh iff the
|
||||||
|
// headerTime plus maxAgeSeconds is greater than the current time.
|
||||||
|
const now = Date.now();
|
||||||
|
return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method will extract the data header and parse it into a useful
|
||||||
|
* value.
|
||||||
|
*
|
||||||
|
* @param {Response} cachedResponse
|
||||||
|
* @return {number}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_getDateHeaderTimestamp(cachedResponse) {
|
||||||
|
if (!cachedResponse.headers.has('date')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dateHeader = cachedResponse.headers.get('date');
|
||||||
|
const parsedDate = new Date(dateHeader);
|
||||||
|
const headerTime = parsedDate.getTime();
|
||||||
|
|
||||||
|
// If the Date header was invalid for some reason, parsedDate.getTime()
|
||||||
|
// will return NaN.
|
||||||
|
if (isNaN(headerTime)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return headerTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A "lifecycle" callback that will be triggered automatically by the
|
||||||
|
* `workbox.runtimeCaching` handlers when an entry is added to a cache.
|
||||||
|
*
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {string} options.cacheName Name of the cache that was updated.
|
||||||
|
* @param {string} options.request The Request for the cached entry.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
cacheDidUpdate({ cacheName, request }) {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(cacheName, 'string', {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'cacheDidUpdate',
|
||||||
|
paramName: 'cacheName'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isInstance(request, Request, {
|
||||||
|
moduleName: 'workbox-cache-expiration',
|
||||||
|
className: 'Plugin',
|
||||||
|
funcName: 'cacheDidUpdate',
|
||||||
|
paramName: 'request'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const cacheExpiration = _this._getCacheExpiration(cacheName);
|
||||||
|
yield cacheExpiration.updateTimestamp(request.url);
|
||||||
|
yield cacheExpiration.expireEntries();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a helper method that performs two operations:
|
||||||
|
*
|
||||||
|
* - Deletes *all* the underlying Cache instances associated with this plugin
|
||||||
|
* instance, by calling caches.delete() on you behalf.
|
||||||
|
* - Deletes the metadata from IndexedDB used to keep track of expiration
|
||||||
|
* details for each Cache instance.
|
||||||
|
*
|
||||||
|
* When using cache expiration, calling this method is preferable to calling
|
||||||
|
* `caches.delete()` directly, since this will ensure that the IndexedDB
|
||||||
|
* metadata is also cleanly removed and open IndexedDB instances are deleted.
|
||||||
|
*
|
||||||
|
* Note that if you're *not* using cache expiration for a given cache, calling
|
||||||
|
* `caches.delete()` and passing in the cache's name should be sufficient.
|
||||||
|
* There is no Workbox-specific method needed for cleanup in that case.
|
||||||
|
*/
|
||||||
|
deleteCacheAndMetadata() {
|
||||||
|
var _this2 = this;
|
||||||
|
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
// Do this one at a time instead of all at once via `Promise.all()` to
|
||||||
|
// reduce the chance of inconsistency if a promise rejects.
|
||||||
|
for (const [cacheName, cacheExpiration] of _this2._cacheExpirations) {
|
||||||
|
yield caches.delete(cacheName);
|
||||||
|
yield cacheExpiration.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset this._cacheExpirations to its initial state.
|
||||||
|
_this2._cacheExpirations = new Map();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.CacheExpiration = CacheExpiration;
|
||||||
|
exports.Plugin = Plugin;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-cache-expiration.dev.js.map
|
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.expiration=function(e,t,r,n,i){"use strict";try{self.workbox.v["workbox:cache-expiration:3.6.3"]=1}catch(e){}const s="url",a="timestamp";class l{constructor(e){this.e=e,this.t=e,this.r=new t.DBWrapper(this.e,2,{onupgradeneeded:e=>this.n(e)})}n(e){const t=e.target.result;e.oldVersion<2&&t.objectStoreNames.contains("workbox-cache-expiration")&&t.deleteObjectStore("workbox-cache-expiration"),t.createObjectStore(this.t,{keyPath:s}).createIndex(a,a,{unique:!1})}setTimestamp(e,t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.r.put(r.t,{[s]:new URL(e,location).href,[a]:t})})()}getAllTimestamps(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.r.getAllMatching(e.t,{index:a})})()}getTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){return(yield t.r.get(t.t,e)).timestamp})()}deleteUrl(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.delete(t.t,new URL(e,location).href)})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){yield e.r.deleteDatabase(),e.r=null})()}}class o{constructor(e,t={}){this.i=!1,this.s=!1,this.a=t.maxEntries,this.l=t.maxAgeSeconds,this.e=e,this.o=new l(e)}expireEntries(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(e.i)return void(e.s=!0);e.i=!0;const t=Date.now(),r=yield e.c(t),n=yield e.u(),i=[...new Set(r.concat(n))];yield Promise.all([e.h(i),e.d(i)]),e.i=!1,e.s&&(e.s=!1,e.expireEntries())})()}c(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)return[];const r=e-1e3*t.l,n=[];return(yield t.o.getAllTimestamps()).forEach(function(e){e.timestamp<r&&n.push(e.url)}),n})()}u(){var e=this;return babelHelpers.asyncToGenerator(function*(){const t=[];if(!e.a)return[];const r=yield e.o.getAllTimestamps();for(;r.length>e.a;){const e=r.shift();t.push(e.url)}return t})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield caches.open(t.e);for(const t of e)yield r.delete(t)})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){for(const r of e)yield t.o.deleteUrl(r)})()}updateTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=new URL(e,location);r.hash="",yield t.o.setTimestamp(r.href,Date.now())})()}isURLExpired(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)throw new r.WorkboxError("expired-test-without-max-age",{methodName:"isURLExpired",paramName:"maxAgeSeconds"});const n=new URL(e,location);return n.hash="",(yield t.o.getTimestamp(n.href))<Date.now()-1e3*t.l})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){e.s=!1,yield e.o.delete()})()}}return e.CacheExpiration=o,e.Plugin=class{constructor(e={}){this.p=e,this.l=e.maxAgeSeconds,this.b=new Map,e.purgeOnQuotaError&&i.registerQuotaErrorCallback(()=>this.deleteCacheAndMetadata())}f(e){if(e===n.cacheNames.getRuntimeName())throw new r.WorkboxError("expire-custom-caches-only");let t=this.b.get(e);return t||(t=new o(e,this.p),this.b.set(e,t)),t}cachedResponseWillBeUsed({cacheName:e,cachedResponse:t}){if(!t)return null;let r=this.m(t);return this.f(e).expireEntries(),r?t:null}m(e){if(!this.l)return!0;const t=this.y(e);return null===t||t>=Date.now()-1e3*this.l}y(e){if(!e.headers.has("date"))return null;const t=e.headers.get("date"),r=new Date(t).getTime();return isNaN(r)?null:r}cacheDidUpdate({cacheName:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){const n=r.f(e);yield n.updateTimestamp(t.url),yield n.expireEntries()})()}deleteCacheAndMetadata(){var e=this;return babelHelpers.asyncToGenerator(function*(){for(const[t,r]of e.b)yield caches.delete(t),yield r.delete();e.b=new Map})()}},e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core);
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-cache-expiration.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cache-expiration/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.expiration=function(e,t,r,n,i){\"use strict\";try{self.workbox.v[\"workbox:cache-expiration:3.6.3\"]=1}catch(e){}const s=\"url\",a=\"timestamp\";class l{constructor(e){this.e=e,this.t=e,this.r=new t.DBWrapper(this.e,2,{onupgradeneeded:e=>this.n(e)})}n(e){const t=e.target.result;e.oldVersion<2&&t.objectStoreNames.contains(\"workbox-cache-expiration\")&&t.deleteObjectStore(\"workbox-cache-expiration\"),t.createObjectStore(this.t,{keyPath:s}).createIndex(a,a,{unique:!1})}setTimestamp(e,t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.r.put(r.t,{[s]:new URL(e,location).href,[a]:t})})()}getAllTimestamps(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.r.getAllMatching(e.t,{index:a})})()}getTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){return(yield t.r.get(t.t,e)).timestamp})()}deleteUrl(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.delete(t.t,new URL(e,location).href)})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){yield e.r.deleteDatabase(),e.r=null})()}}class o{constructor(e,t={}){this.i=!1,this.s=!1,this.a=t.maxEntries,this.l=t.maxAgeSeconds,this.e=e,this.o=new l(e)}expireEntries(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(e.i)return void(e.s=!0);e.i=!0;const t=Date.now(),r=yield e.c(t),n=yield e.u(),i=[...new Set(r.concat(n))];yield Promise.all([e.h(i),e.d(i)]),e.i=!1,e.s&&(e.s=!1,e.expireEntries())})()}c(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)return[];const r=e-1e3*t.l,n=[];return(yield t.o.getAllTimestamps()).forEach(function(e){e.timestamp<r&&n.push(e.url)}),n})()}u(){var e=this;return babelHelpers.asyncToGenerator(function*(){const t=[];if(!e.a)return[];const r=yield e.o.getAllTimestamps();for(;r.length>e.a;){const e=r.shift();t.push(e.url)}return t})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield caches.open(t.e);for(const t of e)yield r.delete(t)})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){for(const r of e)yield t.o.deleteUrl(r)})()}updateTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=new URL(e,location);r.hash=\"\",yield t.o.setTimestamp(r.href,Date.now())})()}isURLExpired(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)throw new r.WorkboxError(\"expired-test-without-max-age\",{methodName:\"isURLExpired\",paramName:\"maxAgeSeconds\"});const n=new URL(e,location);return n.hash=\"\",(yield t.o.getTimestamp(n.href))<Date.now()-1e3*t.l})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){e.s=!1,yield e.o.delete()})()}}return e.CacheExpiration=o,e.Plugin=class{constructor(e={}){this.p=e,this.l=e.maxAgeSeconds,this.b=new Map,e.purgeOnQuotaError&&i.registerQuotaErrorCallback(()=>this.deleteCacheAndMetadata())}f(e){if(e===n.cacheNames.getRuntimeName())throw new r.WorkboxError(\"expire-custom-caches-only\");let t=this.b.get(e);return t||(t=new o(e,this.p),this.b.set(e,t)),t}cachedResponseWillBeUsed({cacheName:e,cachedResponse:t}){if(!t)return null;let r=this.m(t);return this.f(e).expireEntries(),r?t:null}m(e){if(!this.l)return!0;const t=this.y(e);return null===t||t>=Date.now()-1e3*this.l}y(e){if(!e.headers.has(\"date\"))return null;const t=e.headers.get(\"date\"),r=new Date(t).getTime();return isNaN(r)?null:r}cacheDidUpdate({cacheName:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){const n=r.f(e);yield n.updateTimestamp(t.url),yield n.expireEntries()})()}deleteCacheAndMetadata(){var e=this;return babelHelpers.asyncToGenerator(function*(){for(const[t,r]of e.b)yield caches.delete(t),yield r.delete();e.b=new Map})()}},e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core);\n"],"file":"workbox-cache-expiration.prod.js"}
|
236
assets/js/workbox-v3.6.3/workbox-cacheable-response.dev.js
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,getFriendlyURL_mjs,logger_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:cacheable-response:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class allows you to set up rules determining what
|
||||||
|
* status codes and/or headers need to be present in order for a
|
||||||
|
* [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
|
||||||
|
* to be considered cacheable.
|
||||||
|
*
|
||||||
|
* @memberof workbox.cacheableResponse
|
||||||
|
*/
|
||||||
|
class CacheableResponse {
|
||||||
|
/**
|
||||||
|
* To construct a new CacheableResponse instance you must provide at least
|
||||||
|
* one of the `config` properties.
|
||||||
|
*
|
||||||
|
* If both `statuses` and `headers` are specified, then both conditions must
|
||||||
|
* be met for the `Response` to be considered cacheable.
|
||||||
|
*
|
||||||
|
* @param {Object} config
|
||||||
|
* @param {Array<number>} [config.statuses] One or more status codes that a
|
||||||
|
* `Response` can have and be considered cacheable.
|
||||||
|
* @param {Object<string,string>} [config.headers] A mapping of header names
|
||||||
|
* and expected values that a `Response` can have and be considered cacheable.
|
||||||
|
* If multiple headers are provided, only one needs to be present.
|
||||||
|
*/
|
||||||
|
constructor(config = {}) {
|
||||||
|
{
|
||||||
|
if (!(config.statuses || config.headers)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('statuses-or-headers-required', {
|
||||||
|
moduleName: 'workbox-cacheable-response',
|
||||||
|
className: 'CacheableResponse',
|
||||||
|
funcName: 'constructor'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.statuses) {
|
||||||
|
assert_mjs.assert.isArray(config.statuses, {
|
||||||
|
moduleName: 'workbox-cacheable-response',
|
||||||
|
className: 'CacheableResponse',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.statuses'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.headers) {
|
||||||
|
assert_mjs.assert.isType(config.headers, 'object', {
|
||||||
|
moduleName: 'workbox-cacheable-response',
|
||||||
|
className: 'CacheableResponse',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'config.headers'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._statuses = config.statuses;
|
||||||
|
this._headers = config.headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks a response to see whether it's cacheable or not, based on this
|
||||||
|
* object's configuration.
|
||||||
|
*
|
||||||
|
* @param {Response} response The response whose cacheability is being
|
||||||
|
* checked.
|
||||||
|
* @return {boolean} `true` if the `Response` is cacheable, and `false`
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
isResponseCacheable(response) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(response, Response, {
|
||||||
|
moduleName: 'workbox-cacheable-response',
|
||||||
|
className: 'CacheableResponse',
|
||||||
|
funcName: 'isResponseCacheable',
|
||||||
|
paramName: 'response'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let cacheable = true;
|
||||||
|
|
||||||
|
if (this._statuses) {
|
||||||
|
cacheable = this._statuses.includes(response.status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._headers && cacheable) {
|
||||||
|
cacheable = Object.keys(this._headers).some(headerName => {
|
||||||
|
return response.headers.get(headerName) === this._headers[headerName];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
if (!cacheable) {
|
||||||
|
logger_mjs.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_mjs.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`);
|
||||||
|
|
||||||
|
logger_mjs.logger.groupCollapsed(`View cacheability criteria here.`);
|
||||||
|
logger_mjs.logger.unprefixed.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));
|
||||||
|
logger_mjs.logger.unprefixed.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
|
||||||
|
const logFriendlyHeaders = {};
|
||||||
|
response.headers.forEach((value, key) => {
|
||||||
|
logFriendlyHeaders[key] = value;
|
||||||
|
});
|
||||||
|
|
||||||
|
logger_mjs.logger.groupCollapsed(`View response status and headers here.`);
|
||||||
|
logger_mjs.logger.unprefixed.log(`Response status: ` + response.status);
|
||||||
|
logger_mjs.logger.unprefixed.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
|
||||||
|
logger_mjs.logger.groupCollapsed(`View full response details here.`);
|
||||||
|
logger_mjs.logger.unprefixed.log(response.headers);
|
||||||
|
logger_mjs.logger.unprefixed.log(response);
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cacheable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class implementing the `cacheWillUpdate` lifecycle callback. This makes it
|
||||||
|
* easier to add in cacheability checks to requests made via Workbox's built-in
|
||||||
|
* strategies.
|
||||||
|
*
|
||||||
|
* @memberof workbox.cacheableResponse
|
||||||
|
*/
|
||||||
|
class Plugin {
|
||||||
|
/**
|
||||||
|
* To construct a new cacheable response Plugin instance you must provide at
|
||||||
|
* least one of the `config` properties.
|
||||||
|
*
|
||||||
|
* If both `statuses` and `headers` are specified, then both conditions must
|
||||||
|
* be met for the `Response` to be considered cacheable.
|
||||||
|
*
|
||||||
|
* @param {Object} config
|
||||||
|
* @param {Array<number>} [config.statuses] One or more status codes that a
|
||||||
|
* `Response` can have and be considered cacheable.
|
||||||
|
* @param {Object<string,string>} [config.headers] A mapping of header names
|
||||||
|
* and expected values that a `Response` can have and be considered cacheable.
|
||||||
|
* If multiple headers are provided, only one needs to be present.
|
||||||
|
*/
|
||||||
|
constructor(config) {
|
||||||
|
this._cacheableResponse = new CacheableResponse(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Response} options.response
|
||||||
|
* @return {boolean}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
cacheWillUpdate({ response }) {
|
||||||
|
if (this._cacheableResponse.isResponseCacheable(response)) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.CacheableResponse = CacheableResponse;
|
||||||
|
exports.Plugin = Plugin;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-cacheable-response.dev.js.map
|
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){"use strict";try{self.workbox.v["workbox:cacheable-response:3.6.3"]=1}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.e=new s(t)}cacheWillUpdate({response:t}){return this.e.isResponseCacheable(t)?t:null}},t}({});
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-cacheable-response.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cacheable-response/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){\"use strict\";try{self.workbox.v[\"workbox:cacheable-response:3.6.3\"]=1}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.e=new s(t)}cacheWillUpdate({response:t}){return this.e.isResponseCacheable(t)?t:null}},t}({});\n"],"file":"workbox-cacheable-response.prod.js"}
|
1736
assets/js/workbox-v3.6.3/workbox-core.dev.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-core.dev.js.map
Normal file
3
assets/js/workbox-v3.6.3/workbox-core.prod.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-core.prod.js.map
Normal file
255
assets/js/workbox-v3.6.3/workbox-google-analytics.dev.js
Normal file
|
@ -0,0 +1,255 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.googleAnalytics = (function (exports,Plugin_mjs,cacheNames_mjs,Route_mjs,Router_mjs,NetworkFirst_mjs,NetworkOnly_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:google-analytics:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const QUEUE_NAME = 'workbox-google-analytics';
|
||||||
|
const MAX_RETENTION_TIME = 60 * 48; // Two days in minutes
|
||||||
|
const GOOGLE_ANALYTICS_HOST = 'www.google-analytics.com';
|
||||||
|
const GTM_HOST = 'www.googletagmanager.com';
|
||||||
|
const ANALYTICS_JS_PATH = '/analytics.js';
|
||||||
|
const GTAG_JS_PATH = '/gtag/js';
|
||||||
|
|
||||||
|
// This RegExp matches all known Measurement Protocol single-hit collect
|
||||||
|
// endpoints. Most of the time the default path (/collect) is used, but
|
||||||
|
// occasionally an experimental endpoint is used when testing new features,
|
||||||
|
// (e.g. /r/collect or /j/collect)
|
||||||
|
const COLLECT_PATHS_REGEX = /^\/(\w+\/)?collect/;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Promisifies the FileReader API to await a text response from a Blob.
|
||||||
|
*
|
||||||
|
* @param {Blob} blob
|
||||||
|
* @return {Promise<string>}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const getTextFromBlob = (() => {
|
||||||
|
var _ref = babelHelpers.asyncToGenerator(function* (blob) {
|
||||||
|
// This usage of `return await new Promise...` is intentional to work around
|
||||||
|
// a bug in the transpiled/minified output.
|
||||||
|
// See https://github.com/GoogleChrome/workbox/issues/1186
|
||||||
|
return yield new Promise(function (resolve, reject) {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onloadend = function () {
|
||||||
|
return resolve(reader.result);
|
||||||
|
};
|
||||||
|
reader.onerror = function () {
|
||||||
|
return reject(reader.error);
|
||||||
|
};
|
||||||
|
reader.readAsText(blob);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return function getTextFromBlob(_x) {
|
||||||
|
return _ref.apply(this, arguments);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the requestWillDequeue callback to be used with the background
|
||||||
|
* sync queue plugin. The callback takes the failed request and adds the
|
||||||
|
* `qt` param based on the current time, as well as applies any other
|
||||||
|
* user-defined hit modifications.
|
||||||
|
*
|
||||||
|
* @param {Object} config See workbox.googleAnalytics.initialize.
|
||||||
|
* @return {Function} The requestWillDequeu callback function.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const createRequestWillReplayCallback = config => {
|
||||||
|
return (() => {
|
||||||
|
var _ref2 = babelHelpers.asyncToGenerator(function* (storableRequest) {
|
||||||
|
let { url, requestInit, timestamp } = storableRequest;
|
||||||
|
url = new URL(url);
|
||||||
|
|
||||||
|
// Measurement protocol requests can set their payload parameters in either
|
||||||
|
// the URL query string (for GET requests) or the POST body.
|
||||||
|
let params;
|
||||||
|
if (requestInit.body) {
|
||||||
|
const payload = requestInit.body instanceof Blob ? yield getTextFromBlob(requestInit.body) : requestInit.body;
|
||||||
|
|
||||||
|
params = new URLSearchParams(payload);
|
||||||
|
} else {
|
||||||
|
params = url.searchParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the qt param, accounting for the fact that an existing
|
||||||
|
// qt param may be present and should be updated rather than replaced.
|
||||||
|
const originalHitTime = timestamp - (Number(params.get('qt')) || 0);
|
||||||
|
const queueTime = Date.now() - originalHitTime;
|
||||||
|
|
||||||
|
// Set the qt param prior to applying the hitFilter or parameterOverrides.
|
||||||
|
params.set('qt', queueTime);
|
||||||
|
|
||||||
|
if (config.parameterOverrides) {
|
||||||
|
for (const param of Object.keys(config.parameterOverrides)) {
|
||||||
|
const value = config.parameterOverrides[param];
|
||||||
|
params.set(param, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof config.hitFilter === 'function') {
|
||||||
|
config.hitFilter.call(null, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestInit.body = params.toString();
|
||||||
|
requestInit.method = 'POST';
|
||||||
|
requestInit.mode = 'cors';
|
||||||
|
requestInit.credentials = 'omit';
|
||||||
|
requestInit.headers = { 'Content-Type': 'text/plain' };
|
||||||
|
|
||||||
|
// Ignore URL search params as they're now in the post body.
|
||||||
|
storableRequest.url = `${url.origin}${url.pathname}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
return function (_x2) {
|
||||||
|
return _ref2.apply(this, arguments);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates GET and POST routes to catch failed Measurement Protocol hits.
|
||||||
|
*
|
||||||
|
* @param {Plugin} queuePlugin
|
||||||
|
* @return {Array<Route>} The created routes.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const createCollectRoutes = queuePlugin => {
|
||||||
|
const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname);
|
||||||
|
|
||||||
|
const handler = new NetworkOnly_mjs.NetworkOnly({
|
||||||
|
plugins: [queuePlugin]
|
||||||
|
});
|
||||||
|
|
||||||
|
return [new Route_mjs.Route(match, handler, 'GET'), new Route_mjs.Route(match, handler, 'POST')];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a route with a network first strategy for the analytics.js script.
|
||||||
|
*
|
||||||
|
* @param {string} cacheName
|
||||||
|
* @return {Route} The created route.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const createAnalyticsJsRoute = cacheName => {
|
||||||
|
const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH;
|
||||||
|
const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName });
|
||||||
|
|
||||||
|
return new Route_mjs.Route(match, handler, 'GET');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a route with a network first strategy for the gtag.js script.
|
||||||
|
*
|
||||||
|
* @param {string} cacheName
|
||||||
|
* @return {Route} The created route.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const createGtagJsRoute = cacheName => {
|
||||||
|
const match = ({ url }) => url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH;
|
||||||
|
const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName });
|
||||||
|
|
||||||
|
return new Route_mjs.Route(match, handler, 'GET');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object=} [options]
|
||||||
|
* @param {Object} [options.cacheName] The cache name to store and retrieve
|
||||||
|
* analytics.js. Defaults to the cache names provided by `workbox-core`.
|
||||||
|
* @param {Object} [options.parameterOverrides]
|
||||||
|
* [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters),
|
||||||
|
* expressed as key/value pairs, to be added to replayed Google Analytics
|
||||||
|
* requests. This can be used to, e.g., set a custom dimension indicating
|
||||||
|
* that the request was replayed.
|
||||||
|
* @param {Function} [options.hitFilter] A function that allows you to modify
|
||||||
|
* the hit parameters prior to replaying
|
||||||
|
* the hit. The function is invoked with the original hit's URLSearchParams
|
||||||
|
* object as its only argument.
|
||||||
|
*
|
||||||
|
* @memberof workbox.googleAnalytics
|
||||||
|
*/
|
||||||
|
const initialize = (options = {}) => {
|
||||||
|
const cacheName = cacheNames_mjs.cacheNames.getGoogleAnalyticsName(options.cacheName);
|
||||||
|
|
||||||
|
const queuePlugin = new Plugin_mjs.Plugin(QUEUE_NAME, {
|
||||||
|
maxRetentionTime: MAX_RETENTION_TIME,
|
||||||
|
callbacks: {
|
||||||
|
requestWillReplay: createRequestWillReplayCallback(options)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const routes = [createAnalyticsJsRoute(cacheName), createGtagJsRoute(cacheName), ...createCollectRoutes(queuePlugin)];
|
||||||
|
|
||||||
|
const router = new Router_mjs.Router();
|
||||||
|
for (const route of routes) {
|
||||||
|
router.registerRoute(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.addEventListener('fetch', evt => {
|
||||||
|
const responsePromise = router.handleRequest(evt);
|
||||||
|
if (responsePromise) {
|
||||||
|
evt.respondWith(responsePromise);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.initialize = initialize;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-google-analytics.dev.js.map
|
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(e,n,t,o,r,c,s){"use strict";try{self.workbox.v["workbox:google-analytics:3.6.3"]=1}catch(e){}const l=/^\/(\w+\/)?collect/,i=(a=babelHelpers.asyncToGenerator(function*(e){return yield new Promise(function(n,t){const o=new FileReader;o.onloadend=function(){return n(o.result)},o.onerror=function(){return t(o.error)},o.readAsText(e)})}),function(e){return a.apply(this,arguments)});var a;const w=e=>(u=babelHelpers.asyncToGenerator(function*(n){let t,{url:o,requestInit:r,timestamp:c}=n;if(o=new URL(o),r.body){const e=r.body instanceof Blob?yield i(r.body):r.body;t=new URLSearchParams(e)}else t=o.searchParams;const s=c-(Number(t.get("qt"))||0),l=Date.now()-s;if(t.set("qt",l),e.parameterOverrides)for(const n of Object.keys(e.parameterOverrides)){const o=e.parameterOverrides[n];t.set(n,o)}"function"==typeof e.hitFilter&&e.hitFilter.call(null,t),r.body=t.toString(),r.method="POST",r.mode="cors",r.credentials="omit",r.headers={"Content-Type":"text/plain"},n.url=`${o.origin}${o.pathname}`}),function(e){return u.apply(this,arguments)});var u;return e.initialize=((e={})=>{const i=t.cacheNames.getGoogleAnalyticsName(e.cacheName),a=new n.Plugin("workbox-google-analytics",{maxRetentionTime:2880,callbacks:{requestWillReplay:w(e)}}),u=[(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>"www.google-analytics.com"===e.hostname&&"/analytics.js"===e.pathname,n,"GET")})(i),(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>"www.googletagmanager.com"===e.hostname&&"/gtag/js"===e.pathname,n,"GET")})(i),...(e=>{const n=({url:e})=>"www.google-analytics.com"===e.hostname&&l.test(e.pathname),t=new s.NetworkOnly({plugins:[e]});return[new o.Route(n,t,"GET"),new o.Route(n,t,"POST")]})(a)],f=new r.Router;for(const e of u)f.registerRoute(e);self.addEventListener("fetch",e=>{const n=f.handleRequest(e);n&&e.respondWith(n)})}),e}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies);
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-google-analytics.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-google-analytics/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(e,n,t,o,r,c,s){\"use strict\";try{self.workbox.v[\"workbox:google-analytics:3.6.3\"]=1}catch(e){}const l=/^\\/(\\w+\\/)?collect/,i=(a=babelHelpers.asyncToGenerator(function*(e){return yield new Promise(function(n,t){const o=new FileReader;o.onloadend=function(){return n(o.result)},o.onerror=function(){return t(o.error)},o.readAsText(e)})}),function(e){return a.apply(this,arguments)});var a;const w=e=>(u=babelHelpers.asyncToGenerator(function*(n){let t,{url:o,requestInit:r,timestamp:c}=n;if(o=new URL(o),r.body){const e=r.body instanceof Blob?yield i(r.body):r.body;t=new URLSearchParams(e)}else t=o.searchParams;const s=c-(Number(t.get(\"qt\"))||0),l=Date.now()-s;if(t.set(\"qt\",l),e.parameterOverrides)for(const n of Object.keys(e.parameterOverrides)){const o=e.parameterOverrides[n];t.set(n,o)}\"function\"==typeof e.hitFilter&&e.hitFilter.call(null,t),r.body=t.toString(),r.method=\"POST\",r.mode=\"cors\",r.credentials=\"omit\",r.headers={\"Content-Type\":\"text/plain\"},n.url=`${o.origin}${o.pathname}`}),function(e){return u.apply(this,arguments)});var u;return e.initialize=((e={})=>{const i=t.cacheNames.getGoogleAnalyticsName(e.cacheName),a=new n.Plugin(\"workbox-google-analytics\",{maxRetentionTime:2880,callbacks:{requestWillReplay:w(e)}}),u=[(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>\"www.google-analytics.com\"===e.hostname&&\"/analytics.js\"===e.pathname,n,\"GET\")})(i),(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>\"www.googletagmanager.com\"===e.hostname&&\"/gtag/js\"===e.pathname,n,\"GET\")})(i),...(e=>{const n=({url:e})=>\"www.google-analytics.com\"===e.hostname&&l.test(e.pathname),t=new s.NetworkOnly({plugins:[e]});return[new o.Route(n,t,\"GET\"),new o.Route(n,t,\"POST\")]})(a)],f=new r.Router;for(const e of u)f.registerRoute(e);self.addEventListener(\"fetch\",e=>{const n=f.handleRequest(e);n&&e.respondWith(n)})}),e}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies);\n"],"file":"workbox-google-analytics.prod.js"}
|
159
assets/js/workbox-v3.6.3/workbox-navigation-preload.dev.js
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.navigationPreload = (function (exports,logger_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:navigation-preload:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {boolean} Whether or not the current browser supports enabling
|
||||||
|
* navigation preload.
|
||||||
|
*
|
||||||
|
* @memberof workbox.navigationPreload
|
||||||
|
*/
|
||||||
|
function isSupported() {
|
||||||
|
return Boolean(self.registration && self.registration.navigationPreload);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the browser supports Navigation Preload, then this will disable it.
|
||||||
|
*
|
||||||
|
* @memberof workbox.navigationPreload
|
||||||
|
*/
|
||||||
|
function disable() {
|
||||||
|
if (isSupported()) {
|
||||||
|
self.addEventListener('activate', event => {
|
||||||
|
event.waitUntil(self.registration.navigationPreload.disable().then(() => {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Navigation preload is disabled.`);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Navigation preload is not supported in this browser.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the browser supports Navigation Preload, then this will enable it.
|
||||||
|
*
|
||||||
|
* @param {string} [headerValue] Optionally, allows developers to
|
||||||
|
* [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)
|
||||||
|
* the value of the `Service-Worker-Navigation-Preload` header which will be
|
||||||
|
* sent to the server when making the navigation request.
|
||||||
|
*
|
||||||
|
* @memberof workbox.navigationPreload
|
||||||
|
*/
|
||||||
|
function enable(headerValue) {
|
||||||
|
if (isSupported()) {
|
||||||
|
self.addEventListener('activate', event => {
|
||||||
|
event.waitUntil(self.registration.navigationPreload.enable().then(() => {
|
||||||
|
// Defaults to Service-Worker-Navigation-Preload: true if not set.
|
||||||
|
if (headerValue) {
|
||||||
|
self.registration.navigationPreload.setHeaderValue(headerValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Navigation preload is enabled.`);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`Navigation preload is not supported in this browser.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.disable = disable;
|
||||||
|
exports.enable = enable;
|
||||||
|
exports.isSupported = isSupported;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-navigation-preload.dev.js.map
|
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){"use strict";try{self.workbox.v["workbox:navigation-preload:3.6.3"]=1}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.disable().then(()=>{}))})},t.enable=function(t){e()&&self.addEventListener("activate",e=>{e.waitUntil(self.registration.navigationPreload.enable().then(()=>{t&&self.registration.navigationPreload.setHeaderValue(t)}))})},t.isSupported=e,t}({});
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-navigation-preload.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-navigation-preload/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){\"use strict\";try{self.workbox.v[\"workbox:navigation-preload:3.6.3\"]=1}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener(\"activate\",t=>{t.waitUntil(self.registration.navigationPreload.disable().then(()=>{}))})},t.enable=function(t){e()&&self.addEventListener(\"activate\",e=>{e.waitUntil(self.registration.navigationPreload.enable().then(()=>{t&&self.registration.navigationPreload.setHeaderValue(t)}))})},t.isSupported=e,t}({});\n"],"file":"workbox-navigation-preload.prod.js"}
|
1171
assets/js/workbox-v3.6.3/workbox-precaching.dev.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-precaching.dev.js.map
Normal file
3
assets/js/workbox-v3.6.3/workbox-precaching.prod.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-precaching.prod.js.map
Normal file
299
assets/js/workbox-v3.6.3/workbox-range-requests.dev.js
Normal file
|
@ -0,0 +1,299 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.rangeRequests = (function (exports,WorkboxError_mjs,assert_mjs,logger_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:range-requests:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Blob} blob A source blob.
|
||||||
|
* @param {number|null} start The offset to use as the start of the
|
||||||
|
* slice.
|
||||||
|
* @param {number|null} end The offset to use as the end of the slice.
|
||||||
|
* @return {Object} An object with `start` and `end` properties, reflecting
|
||||||
|
* the effective boundaries to use given the size of the blob.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function calculateEffectiveBoundaries(blob, start, end) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(blob, Blob, {
|
||||||
|
moduleName: 'workbox-range-requests',
|
||||||
|
funcName: 'calculateEffectiveBoundaries',
|
||||||
|
paramName: 'blob'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const blobSize = blob.size;
|
||||||
|
|
||||||
|
if (end > blobSize || start < 0) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('range-not-satisfiable', {
|
||||||
|
size: blobSize,
|
||||||
|
end,
|
||||||
|
start
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let effectiveStart;
|
||||||
|
let effectiveEnd;
|
||||||
|
|
||||||
|
if (start === null) {
|
||||||
|
effectiveStart = blobSize - end;
|
||||||
|
effectiveEnd = blobSize;
|
||||||
|
} else if (end === null) {
|
||||||
|
effectiveStart = start;
|
||||||
|
effectiveEnd = blobSize;
|
||||||
|
} else {
|
||||||
|
effectiveStart = start;
|
||||||
|
// Range values are inclusive, so add 1 to the value.
|
||||||
|
effectiveEnd = end + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
start: effectiveStart,
|
||||||
|
end: effectiveEnd
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} rangeHeader A Range: header value.
|
||||||
|
* @return {Object} An object with `start` and `end` properties, reflecting
|
||||||
|
* the parsed value of the Range: header. If either the `start` or `end` are
|
||||||
|
* omitted, then `null` will be returned.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function parseRangeHeader(rangeHeader) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(rangeHeader, 'string', {
|
||||||
|
moduleName: 'workbox-range-requests',
|
||||||
|
funcName: 'parseRangeHeader',
|
||||||
|
paramName: 'rangeHeader'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalizedRangeHeader = rangeHeader.trim().toLowerCase();
|
||||||
|
if (!normalizedRangeHeader.startsWith('bytes=')) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('unit-must-be-bytes', { normalizedRangeHeader });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specifying multiple ranges separate by commas is valid syntax, but this
|
||||||
|
// library only attempts to handle a single, contiguous sequence of bytes.
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax
|
||||||
|
if (normalizedRangeHeader.includes(',')) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('single-range-only', { normalizedRangeHeader });
|
||||||
|
}
|
||||||
|
|
||||||
|
const rangeParts = /(\d*)-(\d*)/.exec(normalizedRangeHeader);
|
||||||
|
// We need either at least one of the start or end values.
|
||||||
|
if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('invalid-range-values', { normalizedRangeHeader });
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
start: rangeParts[1] === '' ? null : Number(rangeParts[1]),
|
||||||
|
end: rangeParts[2] === '' ? null : Number(rangeParts[2])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a `Request` and `Response` objects as input, this will return a
|
||||||
|
* promise for a new `Response`.
|
||||||
|
*
|
||||||
|
* @param {Request} request A request, which should contain a Range:
|
||||||
|
* header.
|
||||||
|
* @param {Response} originalResponse An original response containing the full
|
||||||
|
* content.
|
||||||
|
* @return {Promise<Response>} Either a `206 Partial Content` response, with
|
||||||
|
* the response body set to the slice of content specified by the request's
|
||||||
|
* `Range:` header, or a `416 Range Not Satisfiable` response if the
|
||||||
|
* conditions of the `Range:` header can't be met.
|
||||||
|
*
|
||||||
|
* @memberof workbox.rangeRequests
|
||||||
|
*/
|
||||||
|
let createPartialResponse = (() => {
|
||||||
|
var _ref = babelHelpers.asyncToGenerator(function* (request, originalResponse) {
|
||||||
|
try {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(request, Request, {
|
||||||
|
moduleName: 'workbox-range-requests',
|
||||||
|
funcName: 'createPartialResponse',
|
||||||
|
paramName: 'request'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_mjs.assert.isInstance(originalResponse, Response, {
|
||||||
|
moduleName: 'workbox-range-requests',
|
||||||
|
funcName: 'createPartialResponse',
|
||||||
|
paramName: 'originalResponse'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const rangeHeader = request.headers.get('range');
|
||||||
|
if (!rangeHeader) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('no-range-header');
|
||||||
|
}
|
||||||
|
|
||||||
|
const boundaries = parseRangeHeader(rangeHeader);
|
||||||
|
const originalBlob = yield originalResponse.blob();
|
||||||
|
|
||||||
|
const effectiveBoundaries = calculateEffectiveBoundaries(originalBlob, boundaries.start, boundaries.end);
|
||||||
|
|
||||||
|
const slicedBlob = originalBlob.slice(effectiveBoundaries.start, effectiveBoundaries.end);
|
||||||
|
const slicedBlobSize = slicedBlob.size;
|
||||||
|
|
||||||
|
const slicedResponse = new Response(slicedBlob, {
|
||||||
|
// Status code 206 is for a Partial Content response.
|
||||||
|
// See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206
|
||||||
|
status: 206,
|
||||||
|
statusText: 'Partial Content',
|
||||||
|
headers: originalResponse.headers
|
||||||
|
});
|
||||||
|
|
||||||
|
slicedResponse.headers.set('Content-Length', slicedBlobSize);
|
||||||
|
slicedResponse.headers.set('Content-Range', `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` + originalBlob.size);
|
||||||
|
|
||||||
|
return slicedResponse;
|
||||||
|
} catch (error) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.warn(`Unable to construct a partial response; returning a ` + `416 Range Not Satisfiable response instead.`);
|
||||||
|
logger_mjs.logger.groupCollapsed(`View details here.`);
|
||||||
|
logger_mjs.logger.unprefixed.log(error);
|
||||||
|
logger_mjs.logger.unprefixed.log(request);
|
||||||
|
logger_mjs.logger.unprefixed.log(originalResponse);
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response('', {
|
||||||
|
status: 416,
|
||||||
|
statusText: 'Range Not Satisfiable'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return function createPartialResponse(_x, _x2) {
|
||||||
|
return _ref.apply(this, arguments);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The range request plugin makes it easy for a request with a 'Range' header to
|
||||||
|
* be fulfilled by a cached response.
|
||||||
|
*
|
||||||
|
* It does this by intercepting the `cachedResponseWillBeUsed` plugin callback
|
||||||
|
* and returning the appropriate subset of the cached response body.
|
||||||
|
*
|
||||||
|
* @memberof workbox.rangeRequests
|
||||||
|
*/
|
||||||
|
class Plugin {
|
||||||
|
/**
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Request} options.request The original request, which may or may not
|
||||||
|
* contain a Range: header.
|
||||||
|
* @param {Response} options.cachedResponse The complete cached response.
|
||||||
|
* @return {Promise<Response>} If request contains a 'Range' header, then a
|
||||||
|
* new response with status 206 whose body is a subset of `cachedResponse` is
|
||||||
|
* returned. Otherwise, `cachedResponse` is returned as-is.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
cachedResponseWillBeUsed({ request, cachedResponse }) {
|
||||||
|
return babelHelpers.asyncToGenerator(function* () {
|
||||||
|
// Only return a sliced response if there's something valid in the cache,
|
||||||
|
// and there's a Range: header in the request.
|
||||||
|
if (cachedResponse && request.headers.has('range')) {
|
||||||
|
return yield createPartialResponse(request, cachedResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there was no Range: header, or if cachedResponse wasn't valid, just
|
||||||
|
// pass it through as-is.
|
||||||
|
return cachedResponse;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.createPartialResponse = createPartialResponse;
|
||||||
|
exports.Plugin = Plugin;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private,workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-range-requests.dev.js.map
|
3
assets/js/workbox-v3.6.3/workbox-range-requests.prod.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.rangeRequests=function(e,n){"use strict";try{self.workbox.v["workbox:range-requests:3.6.3"]=1}catch(e){}let t=(r=babelHelpers.asyncToGenerator(function*(e,t){try{const r=e.headers.get("range");if(!r)throw new n.WorkboxError("no-range-header");const s=function(e){const t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new n.WorkboxError("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new n.WorkboxError("single-range-only",{normalizedRangeHeader:t});const r=/(\d*)-(\d*)/.exec(t);if(null===r||!r[1]&&!r[2])throw new n.WorkboxError("invalid-range-values",{normalizedRangeHeader:t});return{start:""===r[1]?null:Number(r[1]),end:""===r[2]?null:Number(r[2])}}(r),a=yield t.blob(),i=function(e,t,r){const s=e.size;if(r>s||t<0)throw new n.WorkboxError("range-not-satisfiable",{size:s,end:r,start:t});let a,i;return null===t?(a=s-r,i=s):null===r?(a=t,i=s):(a=t,i=r+1),{start:a,end:i}}(a,s.start,s.end),l=a.slice(i.start,i.end),o=l.size,u=new Response(l,{status:206,statusText:"Partial Content",headers:t.headers});return u.headers.set("Content-Length",o),u.headers.set("Content-Range",`bytes ${i.start}-${i.end-1}/`+a.size),u}catch(e){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}),function(e,n){return r.apply(this,arguments)});var r;return e.createPartialResponse=t,e.Plugin=class{cachedResponseWillBeUsed({request:e,cachedResponse:n}){return babelHelpers.asyncToGenerator(function*(){return n&&e.headers.has("range")?yield t(e,n):n})()}},e}({},workbox.core._private);
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-range-requests.prod.js.map
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-range-requests/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.rangeRequests=function(e,n){\"use strict\";try{self.workbox.v[\"workbox:range-requests:3.6.3\"]=1}catch(e){}let t=(r=babelHelpers.asyncToGenerator(function*(e,t){try{const r=e.headers.get(\"range\");if(!r)throw new n.WorkboxError(\"no-range-header\");const s=function(e){const t=e.trim().toLowerCase();if(!t.startsWith(\"bytes=\"))throw new n.WorkboxError(\"unit-must-be-bytes\",{normalizedRangeHeader:t});if(t.includes(\",\"))throw new n.WorkboxError(\"single-range-only\",{normalizedRangeHeader:t});const r=/(\\d*)-(\\d*)/.exec(t);if(null===r||!r[1]&&!r[2])throw new n.WorkboxError(\"invalid-range-values\",{normalizedRangeHeader:t});return{start:\"\"===r[1]?null:Number(r[1]),end:\"\"===r[2]?null:Number(r[2])}}(r),a=yield t.blob(),i=function(e,t,r){const s=e.size;if(r>s||t<0)throw new n.WorkboxError(\"range-not-satisfiable\",{size:s,end:r,start:t});let a,i;return null===t?(a=s-r,i=s):null===r?(a=t,i=s):(a=t,i=r+1),{start:a,end:i}}(a,s.start,s.end),l=a.slice(i.start,i.end),o=l.size,u=new Response(l,{status:206,statusText:\"Partial Content\",headers:t.headers});return u.headers.set(\"Content-Length\",o),u.headers.set(\"Content-Range\",`bytes ${i.start}-${i.end-1}/`+a.size),u}catch(e){return new Response(\"\",{status:416,statusText:\"Range Not Satisfiable\"})}}),function(e,n){return r.apply(this,arguments)});var r;return e.createPartialResponse=t,e.Plugin=class{cachedResponseWillBeUsed({request:e,cachedResponse:n}){return babelHelpers.asyncToGenerator(function*(){return n&&e.headers.has(\"range\")?yield t(e,n):n})()}},e}({},workbox.core._private);\n"],"file":"workbox-range-requests.prod.js"}
|
863
assets/js/workbox-v3.6.3/workbox-routing.dev.js
Normal file
|
@ -0,0 +1,863 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.routing = (function (assert_mjs,logger_mjs,WorkboxError_mjs,getFriendlyURL_mjs,cacheNames_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:routing:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default HTTP method, 'GET', used when there's no specific method
|
||||||
|
* configured for a route.
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const defaultMethod = 'GET';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of valid HTTP methods associated with requests that could be routed.
|
||||||
|
*
|
||||||
|
* @type {Array<string>}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {function()|Object} handler Either a function, or an object with a
|
||||||
|
* 'handle' method.
|
||||||
|
* @return {Object} An object with a handle method.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
var normalizeHandler = (handler => {
|
||||||
|
if (handler && typeof handler === 'object') {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.hasMethod(handler, 'handle', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Route',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'handler'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return handler;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(handler, 'function', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Route',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'handler'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return { handle: handler };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A `Route` consists of a pair of callback functions, "match" and "handler".
|
||||||
|
* The "match" callback determine if a route should be used to "handle" a
|
||||||
|
* request by returning a non-falsy value if it can. The "handler" callback
|
||||||
|
* is called when there is a match and should return a Promise that resolves
|
||||||
|
* to a `Response`.
|
||||||
|
*
|
||||||
|
* @memberof workbox.routing
|
||||||
|
*/
|
||||||
|
class Route {
|
||||||
|
/**
|
||||||
|
* Constructor for Route class.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route~matchCallback} match
|
||||||
|
* A callback function that determines whether the route matches a given
|
||||||
|
* `fetch` event by returning a non-falsy value.
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resolving to a Response.
|
||||||
|
* @param {string} [method='GET'] The HTTP method to match the Route
|
||||||
|
* against.
|
||||||
|
*/
|
||||||
|
constructor(match, handler, method) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(match, 'function', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Route',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'match'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (method) {
|
||||||
|
assert_mjs.assert.isOneOf(method, validMethods, { paramName: 'method' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// These values are referenced directly by Router so cannot be
|
||||||
|
// altered by minifification.
|
||||||
|
this.handler = normalizeHandler(handler);
|
||||||
|
this.match = match;
|
||||||
|
this.method = method || defaultMethod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExpRoute makes it easy to create a regular expression based
|
||||||
|
* [Route]{@link workbox.routing.Route}.
|
||||||
|
*
|
||||||
|
* For same-origin requests the RegExp only needs to match part of the URL. For
|
||||||
|
* requests against third-party servers, you must define a RegExp that matches
|
||||||
|
* the start of the URL.
|
||||||
|
*
|
||||||
|
* [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}
|
||||||
|
*
|
||||||
|
* @memberof workbox.routing
|
||||||
|
* @extends workbox.routing.Route
|
||||||
|
*/
|
||||||
|
class RegExpRoute extends Route {
|
||||||
|
/**
|
||||||
|
* If the regulard expression contains
|
||||||
|
* [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},
|
||||||
|
* th ecaptured values will be passed to the
|
||||||
|
* [handler's]{@link workbox.routing.Route~handlerCallback} `params`
|
||||||
|
* argument.
|
||||||
|
*
|
||||||
|
* @param {RegExp} regExp The regular expression to match against URLs.
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resulting in a Response.
|
||||||
|
* @param {string} [method='GET'] The HTTP method to match the Route
|
||||||
|
* against.
|
||||||
|
*/
|
||||||
|
constructor(regExp, handler, method) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(regExp, RegExp, {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'RegExpRoute',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'pattern'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const match = ({ url }) => {
|
||||||
|
const result = regExp.exec(url.href);
|
||||||
|
|
||||||
|
// Return null immediately if there's no match.
|
||||||
|
if (!result) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Require that the match start at the first character in the URL string
|
||||||
|
// if it's a cross-origin request.
|
||||||
|
// See https://github.com/GoogleChrome/workbox/issues/281 for the context
|
||||||
|
// behind this behavior.
|
||||||
|
if (url.origin !== location.origin && result.index !== 0) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the route matches, but there aren't any capture groups defined, then
|
||||||
|
// this will return [], which is truthy and therefore sufficient to
|
||||||
|
// indicate a match.
|
||||||
|
// If there are capture groups, then it will return their values.
|
||||||
|
return result.slice(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
super(match, handler, method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Router can be used to process a FetchEvent through one or more
|
||||||
|
* [Routes]{@link workbox.routing.Route} responding with a Request if
|
||||||
|
* a matching route exists.
|
||||||
|
*
|
||||||
|
* If no route matches a given a request, the Router will use a "default"
|
||||||
|
* handler if one is defined.
|
||||||
|
*
|
||||||
|
* Should the matching Route throw an error, the Router will use a "catch"
|
||||||
|
* handler if one is defined to gracefully deal with issues and respond with a
|
||||||
|
* Request.
|
||||||
|
*
|
||||||
|
* If a request matches multiple routes, the **earliest** registered route will
|
||||||
|
* be used to respond to the request.
|
||||||
|
*
|
||||||
|
* @memberof workbox.routing
|
||||||
|
*/
|
||||||
|
class Router {
|
||||||
|
/**
|
||||||
|
* Initializes a new Router.
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
// _routes will contain a mapping of HTTP method name ('GET', etc.) to an
|
||||||
|
// array of all the corresponding Route instances that are registered.
|
||||||
|
this._routes = new Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply the routing rules to a FetchEvent object to get a Response from an
|
||||||
|
* appropriate Route's handler.
|
||||||
|
*
|
||||||
|
* @param {FetchEvent} event The event from a service worker's 'fetch' event
|
||||||
|
* listener.
|
||||||
|
* @return {Promise<Response>|undefined} A promise is returned if a
|
||||||
|
* registered route can handle the FetchEvent's request. If there is no
|
||||||
|
* matching route and there's no `defaultHandler`, `undefined` is returned.
|
||||||
|
*/
|
||||||
|
handleRequest(event) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isInstance(event, FetchEvent, {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'handleRequest',
|
||||||
|
paramName: 'event'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = new URL(event.request.url);
|
||||||
|
if (!url.protocol.startsWith('http')) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`Workbox Router only supports URLs that start with 'http'.`);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let route = null;
|
||||||
|
let handler = null;
|
||||||
|
let params = null;
|
||||||
|
let debugMessages = [];
|
||||||
|
|
||||||
|
const result = this._findHandlerAndParams(event, url);
|
||||||
|
handler = result.handler;
|
||||||
|
params = result.params;
|
||||||
|
route = result.route;
|
||||||
|
{
|
||||||
|
if (handler) {
|
||||||
|
debugMessages.push([`Found a route to handle this request:`, route]);
|
||||||
|
|
||||||
|
if (params) {
|
||||||
|
debugMessages.push([`Passing the following params to the route's handler:`, params]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we don't have a handler because there was no matching route, then
|
||||||
|
// fall back to defaultHandler if that's defined.
|
||||||
|
if (!handler && this._defaultHandler) {
|
||||||
|
{
|
||||||
|
debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`);
|
||||||
|
|
||||||
|
// This is used for debugging in logs in the case of an error.
|
||||||
|
route = '[Default Handler]';
|
||||||
|
}
|
||||||
|
handler = this._defaultHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handler) {
|
||||||
|
{
|
||||||
|
// No handler so Workbox will do nothing. If logs is set of debug
|
||||||
|
// i.e. verbose, we should print out this information.
|
||||||
|
logger_mjs.logger.debug(`No route found for: ${getFriendlyURL_mjs.getFriendlyURL(url)}`);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// We have a handler, meaning Workbox is going to handle the route.
|
||||||
|
// print the routing details to the console.
|
||||||
|
logger_mjs.logger.groupCollapsed(`Router is responding to: ${getFriendlyURL_mjs.getFriendlyURL(url)}`);
|
||||||
|
debugMessages.forEach(msg => {
|
||||||
|
if (Array.isArray(msg)) {
|
||||||
|
logger_mjs.logger.log(...msg);
|
||||||
|
} else {
|
||||||
|
logger_mjs.logger.log(msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// The Request and Response objects contains a great deal of information,
|
||||||
|
// hide it under a group in case developers want to see it.
|
||||||
|
logger_mjs.logger.groupCollapsed(`View request details here.`);
|
||||||
|
logger_mjs.logger.unprefixed.log(event.request);
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap in try and catch in case the handle method throws a synchronous
|
||||||
|
// error. It should still callback to the catch handler.
|
||||||
|
let responsePromise;
|
||||||
|
try {
|
||||||
|
responsePromise = handler.handle({ url, event, params });
|
||||||
|
} catch (err) {
|
||||||
|
responsePromise = Promise.reject(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responsePromise && this._catchHandler) {
|
||||||
|
responsePromise = responsePromise.catch(err => {
|
||||||
|
{
|
||||||
|
// Still include URL here as it will be async from the console group
|
||||||
|
// and may not make sense without the URL
|
||||||
|
logger_mjs.logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL_mjs.getFriendlyURL(url)}. Falling back to Catch Handler.`);
|
||||||
|
logger_mjs.logger.unprefixed.error(`Error thrown by:`, route);
|
||||||
|
logger_mjs.logger.unprefixed.error(err);
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
}
|
||||||
|
return this._catchHandler.handle({ url, event, err });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return responsePromise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the incoming `event.request` against the registered routes, and if
|
||||||
|
* there's a match, returns the corresponding handler along with any params
|
||||||
|
* generated by the match.
|
||||||
|
*
|
||||||
|
* @param {FetchEvent} event
|
||||||
|
* @param {URL} url
|
||||||
|
* @return {Object} Returns an object with `handler` and `params` properties.
|
||||||
|
* They are populated if a matching route was found or `undefined` otherwise.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_findHandlerAndParams(event, url) {
|
||||||
|
const routes = this._routes.get(event.request.method) || [];
|
||||||
|
for (const route of routes) {
|
||||||
|
let matchResult = route.match({ url, event });
|
||||||
|
if (matchResult) {
|
||||||
|
if (Array.isArray(matchResult) && matchResult.length === 0) {
|
||||||
|
// Instead of passing an empty array in as params, use undefined.
|
||||||
|
matchResult = undefined;
|
||||||
|
} else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0 || matchResult === true) {
|
||||||
|
// Instead of passing an empty object in as params, use undefined.
|
||||||
|
matchResult = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break out of the loop and return the appropriate values as soon as
|
||||||
|
// we have a match.
|
||||||
|
return {
|
||||||
|
route,
|
||||||
|
params: matchResult,
|
||||||
|
handler: route.handler
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we didn't have a match, then return undefined values.
|
||||||
|
return { handler: undefined, params: undefined };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a default `handler` that's called when no routes explicitly
|
||||||
|
* match the incoming request.
|
||||||
|
*
|
||||||
|
* Without a default handler, unmatched requests will go against the
|
||||||
|
* network as if there were no service worker present.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resulting in a Response.
|
||||||
|
*/
|
||||||
|
setDefaultHandler(handler) {
|
||||||
|
this._defaultHandler = normalizeHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a Route throws an error while handling a request, this `handler`
|
||||||
|
* will be called and given a chance to provide a response.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resulting in a Response.
|
||||||
|
*/
|
||||||
|
setCatchHandler(handler) {
|
||||||
|
this._catchHandler = normalizeHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a route with the router.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route} route The route to register.
|
||||||
|
*/
|
||||||
|
registerRoute(route) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(route, 'object', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'route'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_mjs.assert.hasMethod(route, 'match', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'route'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_mjs.assert.isType(route.handler, 'object', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'route'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_mjs.assert.hasMethod(route.handler, 'handle', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'route.handler'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert_mjs.assert.isType(route.method, 'string', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'Router',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'route.method'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._routes.has(route.method)) {
|
||||||
|
this._routes.set(route.method, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give precedence to all of the earlier routes by adding this additional
|
||||||
|
// route to the end of the array.
|
||||||
|
this._routes.get(route.method).push(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters a route with the router.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route} route The route to unregister.
|
||||||
|
*/
|
||||||
|
unregisterRoute(route) {
|
||||||
|
if (!this._routes.has(route.method)) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('unregister-route-but-not-found-with-method', {
|
||||||
|
method: route.method
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const routeIndex = this._routes.get(route.method).indexOf(route);
|
||||||
|
if (routeIndex > -1) {
|
||||||
|
this._routes.get(route.method).splice(routeIndex, 1);
|
||||||
|
} else {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('unregister-route-route-not-registered');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NavigationRoute makes it easy to create a [Route]{@link
|
||||||
|
* workbox.routing.Route} that matches for browser
|
||||||
|
* [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}.
|
||||||
|
*
|
||||||
|
* It will only match incoming Requests whose
|
||||||
|
* [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode}
|
||||||
|
* is set to `navigate`.
|
||||||
|
*
|
||||||
|
* You can optionally only apply this route to a subset of navigation requests
|
||||||
|
* by using one or both of the `blacklist` and `whitelist` parameters.
|
||||||
|
*
|
||||||
|
* @memberof workbox.routing
|
||||||
|
* @extends workbox.routing.Route
|
||||||
|
*/
|
||||||
|
class NavigationRoute extends Route {
|
||||||
|
/**
|
||||||
|
* If both `blacklist` and `whiltelist` are provided, the `blacklist` will
|
||||||
|
* take precedence and the request will not match this route.
|
||||||
|
*
|
||||||
|
* The regular expressions in `whitelist` and `blacklist`
|
||||||
|
* are matched against the concatenated
|
||||||
|
* [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname}
|
||||||
|
* and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search}
|
||||||
|
* portions of the requested URL.
|
||||||
|
*
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resulting in a Response.
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {Array<RegExp>} [options.blacklist] If any of these patterns match,
|
||||||
|
* the route will not handle the request (even if a whitelist RegExp matches).
|
||||||
|
* @param {Array<RegExp>} [options.whitelist=[/./]] If any of these patterns
|
||||||
|
* match the URL's pathname and search parameter, the route will handle the
|
||||||
|
* request (assuming the blacklist doesn't match).
|
||||||
|
*/
|
||||||
|
constructor(handler, { whitelist = [/./], blacklist = [] } = {}) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isArrayOfClass(whitelist, RegExp, {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'NavigationRoute',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'options.whitelist'
|
||||||
|
});
|
||||||
|
assert_mjs.assert.isArrayOfClass(blacklist, RegExp, {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'NavigationRoute',
|
||||||
|
funcName: 'constructor',
|
||||||
|
paramName: 'options.blacklist'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
super((...args) => this._match(...args), handler);
|
||||||
|
|
||||||
|
this._whitelist = whitelist;
|
||||||
|
this._blacklist = blacklist;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Routes match handler.
|
||||||
|
*
|
||||||
|
* @param {Object} options
|
||||||
|
* @param {FetchEvent} options.event
|
||||||
|
* @param {URL} options.url
|
||||||
|
* @return {boolean}
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_match({ event, url }) {
|
||||||
|
if (event.request.mode !== 'navigate') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pathnameAndSearch = url.pathname + url.search;
|
||||||
|
|
||||||
|
if (this._blacklist.some(regExp => regExp.test(pathnameAndSearch))) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `request URL matches both the whitelist and blacklist.`);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._whitelist.some(regExp => regExp.test(pathnameAndSearch))) {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`The navigation route is being used.`);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `URL being navigated to doesn't match the whitelist.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var publicAPI = /*#__PURE__*/Object.freeze({
|
||||||
|
RegExpRoute: RegExpRoute,
|
||||||
|
Route: Route,
|
||||||
|
Router: Router,
|
||||||
|
NavigationRoute: NavigationRoute
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isSwEnv('workbox-routing');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
class DefaultRouter extends Router {
|
||||||
|
/**
|
||||||
|
* Easily register a RegExp, string, or function with a caching
|
||||||
|
* strategy to the Router.
|
||||||
|
*
|
||||||
|
* This method will generate a Route for you if needed and
|
||||||
|
* call [Router.registerRoute()]{@link
|
||||||
|
* workbox.routing.Router#registerRoute}.
|
||||||
|
*
|
||||||
|
* @param {
|
||||||
|
* RegExp|
|
||||||
|
* string|
|
||||||
|
* workbox.routing.Route~matchCallback|
|
||||||
|
* workbox.routing.Route
|
||||||
|
* } capture
|
||||||
|
* If the capture param is a `Route`, all other arguments will be ignored.
|
||||||
|
* @param {workbox.routing.Route~handlerCallback} handler A callback
|
||||||
|
* function that returns a Promise resulting in a Response.
|
||||||
|
* @param {string} [method='GET'] The HTTP method to match the Route
|
||||||
|
* against.
|
||||||
|
* @return {workbox.routing.Route} The generated `Route`(Useful for
|
||||||
|
* unregistering).
|
||||||
|
*
|
||||||
|
* @alias workbox.routing.registerRoute
|
||||||
|
*/
|
||||||
|
registerRoute(capture, handler, method = 'GET') {
|
||||||
|
let route;
|
||||||
|
|
||||||
|
if (typeof capture === 'string') {
|
||||||
|
const captureUrl = new URL(capture, location);
|
||||||
|
|
||||||
|
{
|
||||||
|
if (!(capture.startsWith('/') || capture.startsWith('http'))) {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('invalid-string', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'DefaultRouter',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'capture'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// We want to check if Express-style wildcards are in the pathname only.
|
||||||
|
// TODO: Remove this log message in v4.
|
||||||
|
const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture;
|
||||||
|
// See https://github.com/pillarjs/path-to-regexp#parameters
|
||||||
|
const wildcards = '[*:?+]';
|
||||||
|
if (valueToCheck.match(new RegExp(`${wildcards}`))) {
|
||||||
|
logger_mjs.logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const matchCallback = ({ url }) => {
|
||||||
|
{
|
||||||
|
if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
|
||||||
|
logger_mjs.logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return url.href === captureUrl.href;
|
||||||
|
};
|
||||||
|
|
||||||
|
route = new Route(matchCallback, handler, method);
|
||||||
|
} else if (capture instanceof RegExp) {
|
||||||
|
route = new RegExpRoute(capture, handler, method);
|
||||||
|
} else if (typeof capture === 'function') {
|
||||||
|
route = new Route(capture, handler, method);
|
||||||
|
} else if (capture instanceof Route) {
|
||||||
|
route = capture;
|
||||||
|
} else {
|
||||||
|
throw new WorkboxError_mjs.WorkboxError('unsupported-route-type', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: 'DefaultRouter',
|
||||||
|
funcName: 'registerRoute',
|
||||||
|
paramName: 'capture'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
super.registerRoute(route);
|
||||||
|
return route;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a route that will return a precached file for a navigation
|
||||||
|
* request. This is useful for the
|
||||||
|
* [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}.
|
||||||
|
*
|
||||||
|
* This method will generate a
|
||||||
|
* [NavigationRoute]{@link workbox.routing.NavigationRoute}
|
||||||
|
* and call
|
||||||
|
* [Router.registerRoute()]{@link workbox.routing.Router#registerRoute}
|
||||||
|
* .
|
||||||
|
*
|
||||||
|
* @param {string} cachedAssetUrl
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @param {string} [options.cacheName] Cache name to store and retrieve
|
||||||
|
* requests. Defaults to precache cache name provided by
|
||||||
|
* [workbox-core.cacheNames]{@link workbox.core.cacheNames}.
|
||||||
|
* @param {Array<RegExp>} [options.blacklist=[]] If any of these patterns
|
||||||
|
* match, the route will not handle the request (even if a whitelist entry
|
||||||
|
* matches).
|
||||||
|
* @param {Array<RegExp>} [options.whitelist=[/./]] If any of these patterns
|
||||||
|
* match the URL's pathname and search parameter, the route will handle the
|
||||||
|
* request (assuming the blacklist doesn't match).
|
||||||
|
* @return {workbox.routing.NavigationRoute} Returns the generated
|
||||||
|
* Route.
|
||||||
|
*
|
||||||
|
* @alias workbox.routing.registerNavigationRoute
|
||||||
|
*/
|
||||||
|
registerNavigationRoute(cachedAssetUrl, options = {}) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isType(cachedAssetUrl, 'string', {
|
||||||
|
moduleName: 'workbox-routing',
|
||||||
|
className: '[default export]',
|
||||||
|
funcName: 'registerNavigationRoute',
|
||||||
|
paramName: 'cachedAssetUrl'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(options.cacheName);
|
||||||
|
const handler = () => caches.match(cachedAssetUrl, { cacheName }).then(response => {
|
||||||
|
if (response) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
// This shouldn't normally happen, but there are edge cases:
|
||||||
|
// https://github.com/GoogleChrome/workbox/issues/1441
|
||||||
|
throw new Error(`The cache ${cacheName} did not have an entry for ` + `${cachedAssetUrl}.`);
|
||||||
|
}).catch(error => {
|
||||||
|
// If there's either a cache miss, or the caches.match() call threw
|
||||||
|
// an exception, then attempt to fulfill the navigation request with
|
||||||
|
// a response from the network rather than leaving the user with a
|
||||||
|
// failed navigation.
|
||||||
|
{
|
||||||
|
logger_mjs.logger.debug(`Unable to respond to navigation request with cached ` + `response: ${error.message}. Falling back to network.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This might still fail if the browser is offline...
|
||||||
|
return fetch(cachedAssetUrl);
|
||||||
|
});
|
||||||
|
|
||||||
|
const route = new NavigationRoute(handler, {
|
||||||
|
whitelist: options.whitelist,
|
||||||
|
blacklist: options.blacklist
|
||||||
|
});
|
||||||
|
super.registerRoute(route);
|
||||||
|
|
||||||
|
return route;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const router = new DefaultRouter();
|
||||||
|
|
||||||
|
// By default, register a fetch event listener that will respond to a request
|
||||||
|
// only if there's a matching route.
|
||||||
|
self.addEventListener('fetch', event => {
|
||||||
|
const responsePromise = router.handleRequest(event);
|
||||||
|
if (responsePromise) {
|
||||||
|
event.respondWith(responsePromise);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2017 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const finalExport = Object.assign(router, publicAPI);
|
||||||
|
|
||||||
|
return finalExport;
|
||||||
|
|
||||||
|
}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-routing.dev.js.map
|
1
assets/js/workbox-v3.6.3/workbox-routing.dev.js.map
Normal file
3
assets/js/workbox-v3.6.3/workbox-routing.prod.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.routing=function(t,e){"use strict";try{self.workbox.v["workbox:routing:3.6.3"]=1}catch(t){}const r="GET";var s=t=>t&&"object"==typeof t?t:{handle:t};class n{constructor(t,e,n){this.handler=s(e),this.match=t,this.method=n||r}}class o extends n{constructor(t,e,r){super(({url:e})=>{const r=t.exec(e.href);return r?e.origin!==location.origin&&0!==r.index?null:r.slice(1):null},e,r)}}class i{constructor(){this.t=new Map}handleRequest(t){const e=new URL(t.request.url);if(!e.protocol.startsWith("http"))return;let r=null,s=null,n=null;const o=this.e(t,e);if(s=o.handler,n=o.params,r=o.route,!s&&this.r&&(s=this.r),!s)return;let i;try{i=s.handle({url:e,event:t,params:n})}catch(t){i=Promise.reject(t)}return i&&this.s&&(i=i.catch(r=>this.s.handle({url:e,event:t,err:r}))),i}e(t,e){const r=this.t.get(t.request.method)||[];for(const s of r){let r=s.match({url:e,event:t});if(r)return Array.isArray(r)&&0===r.length?r=void 0:(r.constructor===Object&&0===Object.keys(r).length||!0===r)&&(r=void 0),{route:s,params:r,handler:s.handler}}return{handler:void 0,params:void 0}}setDefaultHandler(t){this.r=s(t)}setCatchHandler(t){this.s=s(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(e){if(!this.t.has(e.method))throw new t.WorkboxError("unregister-route-but-not-found-with-method",{method:e.method});const r=this.t.get(e.method).indexOf(e);if(!(r>-1))throw new t.WorkboxError("unregister-route-route-not-registered");this.t.get(e.method).splice(r,1)}}class u extends n{constructor(t,{whitelist:e=[/./],blacklist:r=[]}={}){super((...t)=>this.n(...t),t),this.o=e,this.i=r}n({event:t,url:e}){if("navigate"!==t.request.mode)return!1;const r=e.pathname+e.search;return!this.i.some(t=>t.test(r))&&!!this.o.some(t=>t.test(r))}}var a=Object.freeze({RegExpRoute:o,Route:n,Router:i,NavigationRoute:u});const c=new class extends i{registerRoute(e,r,s="GET"){let i;if("string"==typeof e){const t=new URL(e,location);i=new n(({url:e})=>e.href===t.href,r,s)}else if(e instanceof RegExp)i=new o(e,r,s);else if("function"==typeof e)i=new n(e,r,s);else{if(!(e instanceof n))throw new t.WorkboxError("unsupported-route-type",{moduleName:"workbox-routing",className:"DefaultRouter",funcName:"registerRoute",paramName:"capture"});i=e}return super.registerRoute(i),i}registerNavigationRoute(t,r={}){const s=e.cacheNames.getPrecacheName(r.cacheName),n=new u(()=>caches.match(t,{cacheName:s}).then(e=>{if(e)return e;throw new Error(`The cache ${s} did not have an entry for `+`${t}.`)}).catch(e=>fetch(t)),{whitelist:r.whitelist,blacklist:r.blacklist});return super.registerRoute(n),n}};return self.addEventListener("fetch",t=>{const e=c.handleRequest(t);e&&t.respondWith(e)}),Object.assign(c,a)}(workbox.core._private,workbox.core._private);
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-routing.prod.js.map
|
1
assets/js/workbox-v3.6.3/workbox-routing.prod.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-routing/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.routing=function(t,e){\"use strict\";try{self.workbox.v[\"workbox:routing:3.6.3\"]=1}catch(t){}const r=\"GET\";var s=t=>t&&\"object\"==typeof t?t:{handle:t};class n{constructor(t,e,n){this.handler=s(e),this.match=t,this.method=n||r}}class o extends n{constructor(t,e,r){super(({url:e})=>{const r=t.exec(e.href);return r?e.origin!==location.origin&&0!==r.index?null:r.slice(1):null},e,r)}}class i{constructor(){this.t=new Map}handleRequest(t){const e=new URL(t.request.url);if(!e.protocol.startsWith(\"http\"))return;let r=null,s=null,n=null;const o=this.e(t,e);if(s=o.handler,n=o.params,r=o.route,!s&&this.r&&(s=this.r),!s)return;let i;try{i=s.handle({url:e,event:t,params:n})}catch(t){i=Promise.reject(t)}return i&&this.s&&(i=i.catch(r=>this.s.handle({url:e,event:t,err:r}))),i}e(t,e){const r=this.t.get(t.request.method)||[];for(const s of r){let r=s.match({url:e,event:t});if(r)return Array.isArray(r)&&0===r.length?r=void 0:(r.constructor===Object&&0===Object.keys(r).length||!0===r)&&(r=void 0),{route:s,params:r,handler:s.handler}}return{handler:void 0,params:void 0}}setDefaultHandler(t){this.r=s(t)}setCatchHandler(t){this.s=s(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(e){if(!this.t.has(e.method))throw new t.WorkboxError(\"unregister-route-but-not-found-with-method\",{method:e.method});const r=this.t.get(e.method).indexOf(e);if(!(r>-1))throw new t.WorkboxError(\"unregister-route-route-not-registered\");this.t.get(e.method).splice(r,1)}}class u extends n{constructor(t,{whitelist:e=[/./],blacklist:r=[]}={}){super((...t)=>this.n(...t),t),this.o=e,this.i=r}n({event:t,url:e}){if(\"navigate\"!==t.request.mode)return!1;const r=e.pathname+e.search;return!this.i.some(t=>t.test(r))&&!!this.o.some(t=>t.test(r))}}var a=Object.freeze({RegExpRoute:o,Route:n,Router:i,NavigationRoute:u});const c=new class extends i{registerRoute(e,r,s=\"GET\"){let i;if(\"string\"==typeof e){const t=new URL(e,location);i=new n(({url:e})=>e.href===t.href,r,s)}else if(e instanceof RegExp)i=new o(e,r,s);else if(\"function\"==typeof e)i=new n(e,r,s);else{if(!(e instanceof n))throw new t.WorkboxError(\"unsupported-route-type\",{moduleName:\"workbox-routing\",className:\"DefaultRouter\",funcName:\"registerRoute\",paramName:\"capture\"});i=e}return super.registerRoute(i),i}registerNavigationRoute(t,r={}){const s=e.cacheNames.getPrecacheName(r.cacheName),n=new u(()=>caches.match(t,{cacheName:s}).then(e=>{if(e)return e;throw new Error(`The cache ${s} did not have an entry for `+`${t}.`)}).catch(e=>fetch(t)),{whitelist:r.whitelist,blacklist:r.blacklist});return super.registerRoute(n),n}};return self.addEventListener(\"fetch\",t=>{const e=c.handleRequest(t);e&&t.respondWith(e)}),Object.assign(c,a)}(workbox.core._private,workbox.core._private);\n"],"file":"workbox-routing.prod.js"}
|
1172
assets/js/workbox-v3.6.3/workbox-strategies.dev.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-strategies.dev.js.map
Normal file
3
assets/js/workbox-v3.6.3/workbox-strategies.prod.js
Normal file
1
assets/js/workbox-v3.6.3/workbox-strategies.prod.js.map
Normal file
380
assets/js/workbox-v3.6.3/workbox-streams.dev.js
Normal file
|
@ -0,0 +1,380 @@
|
||||||
|
this.workbox = this.workbox || {};
|
||||||
|
this.workbox.streams = (function (exports,logger_mjs,assert_mjs) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
try {
|
||||||
|
self.workbox.v['workbox:streams:3.6.3'] = 1;
|
||||||
|
} catch (e) {} // eslint-disable-line
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes either a Response, a ReadableStream, or a
|
||||||
|
* [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the
|
||||||
|
* ReadableStreamReader object associated with it.
|
||||||
|
*
|
||||||
|
* @param {workbox.streams.StreamSource} source
|
||||||
|
* @return {ReadableStreamReader}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _getReaderFromSource(source) {
|
||||||
|
if (source.body && source.body.getReader) {
|
||||||
|
return source.body.getReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.getReader) {
|
||||||
|
return source.getReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: This should be possible to do by constructing a ReadableStream, but
|
||||||
|
// I can't get it to work. As a hack, construct a new Response, and use the
|
||||||
|
// reader associated with its body.
|
||||||
|
return new Response(source).body.getReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes multiple source Promises, each of which could resolve to a Response, a
|
||||||
|
* ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit).
|
||||||
|
*
|
||||||
|
* Returns an object exposing a ReadableStream with each individual stream's
|
||||||
|
* data returned in sequence, along with a Promise which signals when the
|
||||||
|
* stream is finished (useful for passing to a FetchEvent's waitUntil()).
|
||||||
|
*
|
||||||
|
* @param {Array<Promise<workbox.streams.StreamSource>>} sourcePromises
|
||||||
|
* @return {Object<{done: Promise, stream: ReadableStream}>}
|
||||||
|
*
|
||||||
|
* @memberof workbox.streams
|
||||||
|
*/
|
||||||
|
function concatenate(sourcePromises) {
|
||||||
|
{
|
||||||
|
assert_mjs.assert.isArray(sourcePromises, {
|
||||||
|
moduleName: 'workbox-streams',
|
||||||
|
funcName: 'concatenate',
|
||||||
|
paramName: 'sourcePromises'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const readerPromises = sourcePromises.map(sourcePromise => {
|
||||||
|
return Promise.resolve(sourcePromise).then(source => {
|
||||||
|
return _getReaderFromSource(source);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
let fullyStreamedResolve;
|
||||||
|
let fullyStreamedReject;
|
||||||
|
const done = new Promise((resolve, reject) => {
|
||||||
|
fullyStreamedResolve = resolve;
|
||||||
|
fullyStreamedReject = reject;
|
||||||
|
});
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
const logMessages = [];
|
||||||
|
const stream = new ReadableStream({
|
||||||
|
pull(controller) {
|
||||||
|
return readerPromises[i].then(reader => reader.read()).then(result => {
|
||||||
|
if (result.done) {
|
||||||
|
{
|
||||||
|
logMessages.push(['Reached the end of source:', sourcePromises[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
if (i >= readerPromises.length) {
|
||||||
|
// Log all the messages in the group at once in a single group.
|
||||||
|
{
|
||||||
|
logger_mjs.logger.groupCollapsed(`Concatenating ${readerPromises.length} sources.`);
|
||||||
|
for (const message of logMessages) {
|
||||||
|
if (Array.isArray(message)) {
|
||||||
|
logger_mjs.logger.log(...message);
|
||||||
|
} else {
|
||||||
|
logger_mjs.logger.log(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger_mjs.logger.log('Finished reading all sources.');
|
||||||
|
logger_mjs.logger.groupEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
controller.close();
|
||||||
|
fullyStreamedResolve();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.pull(controller);
|
||||||
|
} else {
|
||||||
|
controller.enqueue(result.value);
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.error('An error occurred:', error);
|
||||||
|
}
|
||||||
|
fullyStreamedReject(error);
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
{
|
||||||
|
logger_mjs.logger.warn('The ReadableStream was cancelled.');
|
||||||
|
}
|
||||||
|
|
||||||
|
fullyStreamedResolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return { done, stream };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a utility method that determines whether the current browser supports
|
||||||
|
* the features required to create streamed responses. Currently, it checks if
|
||||||
|
* [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)
|
||||||
|
* is available.
|
||||||
|
*
|
||||||
|
* @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,
|
||||||
|
* `'text/html'` will be used by default.
|
||||||
|
* @return {boolean} `true`, if the current browser meets the requirements for
|
||||||
|
* streaming responses, and `false` otherwise.
|
||||||
|
*
|
||||||
|
* @memberof workbox.streams
|
||||||
|
*/
|
||||||
|
function createHeaders(headersInit = {}) {
|
||||||
|
// See https://github.com/GoogleChrome/workbox/issues/1461
|
||||||
|
const headers = new Headers(headersInit);
|
||||||
|
if (!headers.has('content-type')) {
|
||||||
|
headers.set('content-type', 'text/html');
|
||||||
|
}
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes multiple source Promises, each of which could resolve to a Response, a
|
||||||
|
* ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit),
|
||||||
|
* along with a
|
||||||
|
* [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit).
|
||||||
|
*
|
||||||
|
* Returns an object exposing a Response whose body consists of each individual
|
||||||
|
* stream's data returned in sequence, along with a Promise which signals when
|
||||||
|
* the stream is finished (useful for passing to a FetchEvent's waitUntil()).
|
||||||
|
*
|
||||||
|
* @param {Array<Promise<workbox.streams.StreamSource>>} sourcePromises
|
||||||
|
* @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,
|
||||||
|
* `'text/html'` will be used by default.
|
||||||
|
* @return {Object<{done: Promise, response: Response}>}
|
||||||
|
*
|
||||||
|
* @memberof workbox.streams
|
||||||
|
*/
|
||||||
|
function concatenateToResponse(sourcePromises, headersInit) {
|
||||||
|
const { done, stream } = concatenate(sourcePromises);
|
||||||
|
|
||||||
|
const headers = createHeaders(headersInit);
|
||||||
|
const response = new Response(stream, { headers });
|
||||||
|
|
||||||
|
return { done, response };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let cachedIsSupported = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a utility method that determines whether the current browser supports
|
||||||
|
* the features required to create streamed responses. Currently, it checks if
|
||||||
|
* [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)
|
||||||
|
* can be created.
|
||||||
|
*
|
||||||
|
* @return {boolean} `true`, if the current browser meets the requirements for
|
||||||
|
* streaming responses, and `false` otherwise.
|
||||||
|
*
|
||||||
|
* @memberof workbox.streams
|
||||||
|
*/
|
||||||
|
function isSupported() {
|
||||||
|
if (cachedIsSupported === undefined) {
|
||||||
|
// See https://github.com/GoogleChrome/workbox/issues/1473
|
||||||
|
try {
|
||||||
|
new ReadableStream({ start() {} });
|
||||||
|
cachedIsSupported = true;
|
||||||
|
} catch (error) {
|
||||||
|
cachedIsSupported = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cachedIsSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A shortcut to create a strategy that could be dropped-in to Workbox's router.
|
||||||
|
*
|
||||||
|
* On browsers that do not support constructing new `ReadableStream`s, this
|
||||||
|
* strategy will automatically wait for all the `sourceFunctions` to complete,
|
||||||
|
* and create a final response that concatenates their values together.
|
||||||
|
*
|
||||||
|
* @param {
|
||||||
|
* Array<function(workbox.routing.Route~handlerCallback)>} sourceFunctions
|
||||||
|
* Each function should return a {@link workbox.streams.StreamSource} (or a
|
||||||
|
* Promise which resolves to one).
|
||||||
|
* @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,
|
||||||
|
* `'text/html'` will be used by default.
|
||||||
|
* @return {workbox.routing.Route~handlerCallback}
|
||||||
|
*
|
||||||
|
* @memberof workbox.streams
|
||||||
|
*/
|
||||||
|
function strategy(sourceFunctions, headersInit) {
|
||||||
|
return (() => {
|
||||||
|
var _ref = babelHelpers.asyncToGenerator(function* ({ event, url, params }) {
|
||||||
|
if (isSupported()) {
|
||||||
|
const { done, response } = concatenateToResponse(sourceFunctions.map(function (sourceFunction) {
|
||||||
|
return sourceFunction({ event, url, params });
|
||||||
|
}), headersInit);
|
||||||
|
event.waitUntil(done);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
logger_mjs.logger.log(`The current browser doesn't support creating response ` + `streams. Falling back to non-streaming response instead.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to waiting for everything to finish, and concatenating the
|
||||||
|
// responses.
|
||||||
|
const parts = yield Promise.all(sourceFunctions.map(function (sourceFunction) {
|
||||||
|
return sourceFunction({ event, url, params });
|
||||||
|
}).map((() => {
|
||||||
|
var _ref2 = babelHelpers.asyncToGenerator(function* (responsePromise) {
|
||||||
|
const response = yield responsePromise;
|
||||||
|
if (response instanceof Response) {
|
||||||
|
return response.blob();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, assume it's something like a string which can be used
|
||||||
|
// as-is when constructing the final composite blob.
|
||||||
|
return response;
|
||||||
|
});
|
||||||
|
|
||||||
|
return function (_x2) {
|
||||||
|
return _ref2.apply(this, arguments);
|
||||||
|
};
|
||||||
|
})()));
|
||||||
|
|
||||||
|
const headers = createHeaders(headersInit);
|
||||||
|
// Constructing a new Response from a Blob source is well-supported.
|
||||||
|
// So is constructing a new Blob from multiple source Blobs or strings.
|
||||||
|
return new Response(new Blob(parts), { headers });
|
||||||
|
});
|
||||||
|
|
||||||
|
return function (_x) {
|
||||||
|
return _ref.apply(this, arguments);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.concatenate = concatenate;
|
||||||
|
exports.concatenateToResponse = concatenateToResponse;
|
||||||
|
exports.isSupported = isSupported;
|
||||||
|
exports.strategy = strategy;
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
}({},workbox.core._private,workbox.core._private));
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-streams.dev.js.map
|
1
assets/js/workbox-v3.6.3/workbox-streams.dev.js.map
Normal file
3
assets/js/workbox-v3.6.3/workbox-streams.prod.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
this.workbox=this.workbox||{},this.workbox.streams=function(e){"use strict";try{self.workbox.v["workbox:streams:3.6.3"]=1}catch(e){}function n(e){const n=e.map(e=>Promise.resolve(e).then(e=>(e=e).body&&e.body.getReader?e.body.getReader():e.getReader?e.getReader():new Response(e).body.getReader()));var t;let r,s;let o=0;return{done:new Promise((e,n)=>{r=e,s=n}),stream:new ReadableStream({pull(e){return n[o].then(e=>e.read()).then(t=>{if(t.done)return++o>=n.length?(e.close(),void r()):this.pull(e);e.enqueue(t.value)}).catch(e=>{throw s(e),e})},cancel(){r()}})}}function t(e={}){const n=new Headers(e);return n.has("content-type")||n.set("content-type","text/html"),n}function r(e,r){const{done:s,stream:o}=n(e),u=t(r);return{done:s,response:new Response(o,{headers:u})}}let s=void 0;function o(){if(void 0===s)try{new ReadableStream({start(){}}),s=!0}catch(e){s=!1}return s}return e.concatenate=n,e.concatenateToResponse=r,e.isSupported=o,e.strategy=function(e,n){return s=babelHelpers.asyncToGenerator(function*({event:s,url:u,params:i}){if(o()){const{done:t,response:o}=r(e.map(function(e){return e({event:s,url:u,params:i})}),n);return s.waitUntil(t),o}const c=yield Promise.all(e.map(function(e){return e({event:s,url:u,params:i})}).map((a=babelHelpers.asyncToGenerator(function*(e){const n=yield e;return n instanceof Response?n.blob():n}),function(e){return a.apply(this,arguments)})));var a;const l=t(n);return new Response(new Blob(c),{headers:l})}),function(e){return s.apply(this,arguments)};var s},e}({});
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-streams.prod.js.map
|
1
assets/js/workbox-v3.6.3/workbox-streams.prod.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-streams/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.streams=function(e){\"use strict\";try{self.workbox.v[\"workbox:streams:3.6.3\"]=1}catch(e){}function n(e){const n=e.map(e=>Promise.resolve(e).then(e=>(e=e).body&&e.body.getReader?e.body.getReader():e.getReader?e.getReader():new Response(e).body.getReader()));var t;let r,s;let o=0;return{done:new Promise((e,n)=>{r=e,s=n}),stream:new ReadableStream({pull(e){return n[o].then(e=>e.read()).then(t=>{if(t.done)return++o>=n.length?(e.close(),void r()):this.pull(e);e.enqueue(t.value)}).catch(e=>{throw s(e),e})},cancel(){r()}})}}function t(e={}){const n=new Headers(e);return n.has(\"content-type\")||n.set(\"content-type\",\"text/html\"),n}function r(e,r){const{done:s,stream:o}=n(e),u=t(r);return{done:s,response:new Response(o,{headers:u})}}let s=void 0;function o(){if(void 0===s)try{new ReadableStream({start(){}}),s=!0}catch(e){s=!1}return s}return e.concatenate=n,e.concatenateToResponse=r,e.isSupported=o,e.strategy=function(e,n){return s=babelHelpers.asyncToGenerator(function*({event:s,url:u,params:i}){if(o()){const{done:t,response:o}=r(e.map(function(e){return e({event:s,url:u,params:i})}),n);return s.waitUntil(t),o}const c=yield Promise.all(e.map(function(e){return e({event:s,url:u,params:i})}).map((a=babelHelpers.asyncToGenerator(function*(e){const n=yield e;return n instanceof Response?n.blob():n}),function(e){return a.apply(this,arguments)})));var a;const l=t(n);return new Response(new Blob(c),{headers:l})}),function(e){return s.apply(this,arguments)};var s},e}({});\n"],"file":"workbox-streams.prod.js"}
|
3
assets/js/workbox-v3.6.3/workbox-sw.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
var workbox=function(){"use strict";try{self.workbox.v["workbox:sw:3.6.3"]=1}catch(t){}const t="https://storage.googleapis.com/workbox-cdn/releases/3.6.3",e={backgroundSync:"background-sync",broadcastUpdate:"broadcast-cache-update",cacheableResponse:"cacheable-response",core:"core",expiration:"cache-expiration",googleAnalytics:"google-analytics",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};return new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.e=this.t.debug?"dev":"prod",this.s=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.s)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.e=this.t.debug?"dev":"prod"}skipWaiting(){self.addEventListener("install",()=>self.skipWaiting())}clientsClaim(){self.addEventListener("activate",()=>self.clients.claim())}loadModule(t){const e=this.o(t);try{importScripts(e),this.s=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}o(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.e}.js`,r=this.t.modulePathPrefix;return r&&""===(s=r.split("/"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join("/")}}}();
|
||||||
|
|
||||||
|
//# sourceMappingURL=workbox-sw.js.map
|
1
assets/js/workbox-v3.6.3/workbox-sw.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"names":[],"mappings":"","sources":["packages/workbox-sw/browser.mjs"],"sourcesContent":["var workbox=function(){\"use strict\";try{self.workbox.v[\"workbox:sw:3.6.3\"]=1}catch(t){}const t=\"https://storage.googleapis.com/workbox-cdn/releases/3.6.3\",e={backgroundSync:\"background-sync\",broadcastUpdate:\"broadcast-cache-update\",cacheableResponse:\"cacheable-response\",core:\"core\",expiration:\"cache-expiration\",googleAnalytics:\"google-analytics\",navigationPreload:\"navigation-preload\",precaching:\"precaching\",rangeRequests:\"range-requests\",routing:\"routing\",strategies:\"strategies\",streams:\"streams\"};return new class{constructor(){return this.v={},this.t={debug:\"localhost\"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.e=this.t.debug?\"dev\":\"prod\",this.s=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.s)throw new Error(\"Config must be set before accessing workbox.* modules\");Object.assign(this.t,t),this.e=this.t.debug?\"dev\":\"prod\"}skipWaiting(){self.addEventListener(\"install\",()=>self.skipWaiting())}clientsClaim(){self.addEventListener(\"activate\",()=>self.clients.claim())}loadModule(t){const e=this.o(t);try{importScripts(e),this.s=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}o(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.e}.js`,r=this.t.modulePathPrefix;return r&&\"\"===(s=r.split(\"/\"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join(\"/\")}}}();\n"],"file":"workbox-sw.js"}
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -394,7 +397,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -519,7 +522,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -538,7 +541,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -571,5 +574,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -541,7 +544,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -666,7 +669,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -685,7 +688,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -718,5 +721,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -714,7 +717,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -839,7 +842,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -858,7 +861,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -891,5 +894,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -350,7 +353,7 @@ Open your mind, open the source!</p>
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -475,7 +478,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -494,7 +497,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -527,5 +530,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
BIN
favicon-16x16-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 596 B |
BIN
favicon-32x32-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
favicon-96x96-dunplab-manifest-9805.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
2
feed.xml
|
@ -6,7 +6,7 @@
|
||||||
<atom:link href="https://setto.basspistol.com/rss.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="https://setto.basspistol.com/rss.xml" rel="self" type="application/rss+xml" />
|
||||||
<link>https://setto.basspistol.com</link>
|
<link>https://setto.basspistol.com</link>
|
||||||
<description>Set, Party, Gang! &#35;Cybersoul.</description>
|
<description>Set, Party, Gang! &#35;Cybersoul.</description>
|
||||||
<lastBuildDate>Wed, 05 Aug 2020 11:05:19 +0000</lastBuildDate>
|
<lastBuildDate>Wed, 05 Aug 2020 17:06:33 +0000</lastBuildDate>
|
||||||
<language>en-US</language>
|
<language>en-US</language>
|
||||||
<sy:updatePeriod>hourly</sy:updatePeriod>
|
<sy:updatePeriod>hourly</sy:updatePeriod>
|
||||||
<sy:updateFrequency>1</sy:updateFrequency>
|
<sy:updateFrequency>1</sy:updateFrequency>
|
||||||
|
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 187 KiB |
38
index.html
|
@ -38,7 +38,7 @@
|
||||||
<title>Yo, web-TV crib! ゲットー・スービド | 徒 setto セット</title>
|
<title>Yo, web-TV crib! ゲットー・スービド | 徒 setto セット</title>
|
||||||
<meta name="title" content="Yo, web-TV crib! ゲットー・スービド | 徒 setto セット" />
|
<meta name="title" content="Yo, web-TV crib! ゲットー・スービド | 徒 setto セット" />
|
||||||
<meta name="description" content="The music of To Setto Setto is a cypher cloud jam induced by popcorn chewing threads in obscure chat-rooms." />
|
<meta name="description" content="The music of To Setto Setto is a cypher cloud jam induced by popcorn chewing threads in obscure chat-rooms." />
|
||||||
<meta name="dc.date.modified" scheme="ISO8601" content="2020-08-05T09:18:47+00:00" />
|
<meta name="dc.date.modified" scheme="ISO8601" content="2020-08-05T17:06:29+00:00" />
|
||||||
<meta name="robots" content="index" />
|
<meta name="robots" content="index" />
|
||||||
|
|
||||||
<link rel="canonical" href="https://setto.basspistol.com/" />
|
<link rel="canonical" href="https://setto.basspistol.com/" />
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
<meta property="og:url" content="https://setto.basspistol.com/" />
|
<meta property="og:url" content="https://setto.basspistol.com/" />
|
||||||
<meta property="og:site_name" content="徒 setto セット" />
|
<meta property="og:site_name" content="徒 setto セット" />
|
||||||
<meta property="og:type" content="webpage" />
|
<meta property="og:type" content="webpage" />
|
||||||
<meta property="article:published_time" content="2020-08-05T09:18:47+00:00" />
|
<meta property="article:published_time" content="2020-08-05T17:06:29+00:00" />
|
||||||
<meta property="og:image" content="https://setto.basspistol.com/images/pages/pingu.jpg" />
|
<meta property="og:image" content="https://setto.basspistol.com/images/pages/pingu.jpg" />
|
||||||
<!-- Twitter Card -->
|
<!-- Twitter Card -->
|
||||||
|
|
||||||
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="./assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="./assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -197,7 +200,7 @@
|
||||||
<article>
|
<article>
|
||||||
<figure>
|
<figure>
|
||||||
<a href="/unmet-dependencies/">
|
<a href="/unmet-dependencies/">
|
||||||
<img src="https://media.basspistol.com/setto.basspistol.com/unmet-dependencies/1-dependency-error.jpeg" /></a>
|
<img src="https://media.basspistol.com/setto.basspistol.com/unmet-dependencies/1-dependency-error.jpeg" alt="Cover art for Unmet Dependencies" /></a>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
<strong>Unmet Dependencies</strong><br />
|
<strong>Unmet Dependencies</strong><br />
|
||||||
|
|
||||||
|
@ -240,7 +243,7 @@
|
||||||
<article>
|
<article>
|
||||||
<figure>
|
<figure>
|
||||||
<a href="/darkweb/">
|
<a href="/darkweb/">
|
||||||
<img src="https://media.basspistol.com/setto.basspistol.com/darkweb/1-swipe.jpeg" /></a>
|
<img src="https://media.basspistol.com/setto.basspistol.com/darkweb/1-swipe.jpeg" alt="Cover art for Darkweb" /></a>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
<strong>Darkweb</strong><br />
|
<strong>Darkweb</strong><br />
|
||||||
|
|
||||||
|
@ -295,7 +298,7 @@
|
||||||
<article>
|
<article>
|
||||||
<figure>
|
<figure>
|
||||||
<a href="/satoshi-mon-ami/">
|
<a href="/satoshi-mon-ami/">
|
||||||
<img src="https://media.basspistol.com/setto.basspistol.com/satoshi-mon-ami/1-k-as-tu-fait-de-nous-.jpeg" /></a>
|
<img src="https://media.basspistol.com/setto.basspistol.com/satoshi-mon-ami/1-k-as-tu-fait-de-nous-.jpeg" alt="Cover art for Satoshi Mon Ami" /></a>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
<strong>Satoshi mon ami</strong><br />
|
<strong>Satoshi mon ami</strong><br />
|
||||||
|
|
||||||
|
@ -332,7 +335,7 @@
|
||||||
<article>
|
<article>
|
||||||
<figure>
|
<figure>
|
||||||
<a href="/live-with-hardware/">
|
<a href="/live-with-hardware/">
|
||||||
<img src="https://media.basspistol.com/setto.basspistol.com/live-with-hardware/1-ep-life-of-a-dudelini.jpeg" /></a>
|
<img src="https://media.basspistol.com/setto.basspistol.com/live-with-hardware/1-ep-life-of-a-dudelini.jpeg" alt="Cover art for Live with hardware" /></a>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
<strong>EP-Life of a Dudelini</strong><br />
|
<strong>EP-Life of a Dudelini</strong><br />
|
||||||
11:23 |
|
11:23 |
|
||||||
|
@ -395,7 +398,7 @@
|
||||||
<article>
|
<article>
|
||||||
<figure>
|
<figure>
|
||||||
<a href="/cyber-grany/">
|
<a href="/cyber-grany/">
|
||||||
<img src="https://media.basspistol.com/setto.basspistol.com/cyber-grany/1-grandma-got-the-ssh-keys.jpeg" /></a>
|
<img src="https://media.basspistol.com/setto.basspistol.com/cyber-grany/1-grandma-got-the-ssh-keys.jpeg" alt="Cover art for Granny is a cyborg now" /></a>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
<strong>Grandma got the SSH keys</strong><br />
|
<strong>Grandma got the SSH keys</strong><br />
|
||||||
3:22 |
|
3:22 |
|
||||||
|
@ -508,7 +511,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -631,7 +634,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -650,7 +653,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -683,5 +686,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="./assets/js/set-20200805.js"></script>
|
<script src="./assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -321,7 +324,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -446,7 +449,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -465,7 +468,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -498,5 +501,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -550,7 +553,7 @@ Open your mind, open the source!</p>
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -675,7 +678,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -694,7 +697,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -727,5 +730,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -265,7 +268,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -390,7 +393,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -409,7 +412,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -442,5 +445,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
85
manifest.json
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
{
|
||||||
|
"short_name": "徒 setto セット",
|
||||||
|
"name": "徒 setto セット Music PWA",
|
||||||
|
"lang": "en",
|
||||||
|
"description": "Music of 徒 setto セット in your phone",
|
||||||
|
"start_url": "/",
|
||||||
|
"background_color": "#3c2a52",
|
||||||
|
"theme_color": "#3c2a52",
|
||||||
|
"dir": "ltr",
|
||||||
|
"display": "standalone",
|
||||||
|
"orientation": "portrait",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/setto-webapp.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/android-icon-192x192-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "192x192"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-180x180-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "180x180"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-152x152-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "152x152"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-144x144-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "144x144"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-120x120-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "120x120"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-114x114-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "114x114"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/favicon-96x96-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "96x96"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-76x76-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-72x72-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "72x72"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-60x60-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/apple-icon-57x57-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "57x57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/favicon-32x32-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "32x32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/favicon-16x16-dunplab-manifest-9805.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "16x16"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prefer_related_applications": "false"
|
||||||
|
}
|
|
@ -110,6 +110,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -620,7 +623,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -745,7 +748,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -764,7 +767,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -797,5 +800,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
45
service-worker.js
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
importScripts("/assets/js/workbox-v3.6.3/workbox-sw.js");
|
||||||
|
workbox.setConfig({modulePathPrefix: "/assets/js/workbox-v3.6.3"});
|
||||||
|
|
||||||
|
self.__precacheManifest = [{"url":"/assets/js/set-20200805.js","revision":"517470941a809ec5c83021184f35da41"},{"url":"/assets/js/jquery-3.5.1.min.js","revision":"dc5e7f18c8d36ac1d3d4753a87c98d0a"},{"url":"/assets/css/all.min.css","revision":"84d8ad2b4fcdc0f0c58247e778133b3a"},{"url":"/assets/css/main-20200805-rv2.css","revision":"48269055ca56f3bb1b1066b14a8b94a1"},{"url":"/assets/css/noscripts-20200805.css","revision":"c885f65544603a3fed916541ef06ebf2"},{"url":"/assets/fonts/Staatliches-Regular.ttf","revision":"d5746e3b20453d6cee99ab27a0bdf949"},{"url":"/assets/fonts/Astloch-Bold.ttf","revision":"3176f98d79118ba60dea5cad816a330c"},{"url":"/assets/fonts/JetBrainsMono_Italic.ttf","revision":"8d0942fbfa63674fa465f104ca33e043"},{"url":"/assets/fonts/JetBrainsMono_ExtraBold_Italic.ttf","revision":"052f9246bfdfa8a9edc7e626845a6ee6"},{"url":"/assets/fonts/JetBrainsMono_ExtraBold.ttf","revision":"131dbc72ef3af778e86d34efb1fc8972"},{"url":"/assets/fonts/JetBrainsMono_Bold.ttf","revision":"d8af470e44be6c1d2d07dee84db355f6"},{"url":"/assets/fonts/JetBrainsMono_Bold_Italic.ttf","revision":"111bcb2a39ae6140cb21daa3ecd052d1"},{"url":"/assets/fonts/JetBrainsMono_Regular.ttf","revision":"e1caef645de334fee2f25834b0d03c28"},{"url":"/images/setto-logo.svg","revision":"7569ca4090da48547a54fa0ddedda3fd"},{"url":"/images/setto_logo.svg","revision":"5bf66a9e824036039f132a2c99608cfc"},{"url":"/images/setto-logo-dark.svg","revision":"609edc224ff5d3b8ded04619ae9f50a1"},{"url":"/images/setto-logoicon.svg","revision":"e7dc833aac730977d63da33840f5d2ce"},{"url":"/images/posts/final-pingnucover1220x1200.jpg","revision":"40bf2aa467fc998f16966f6299772aa3"},{"url":"/images/posts/333mix.jpg","revision":"8370744fc4e6bd11153f05bdae4d017f"},{"url":"/images/posts/1-ep-life-of-a-dudelini.jpeg","revision":"5f0556d93f8df15b7283d7184e7e205f"},{"url":"/images/posts/1-grandma-got-the-ssh-keys.jpeg","revision":"f17c4fa35cfd429715093fc170ff37db"},{"url":"/images/posts/1-k-as-tu-fait-de-nous-.jpeg","revision":"c75a92953e880cca8ae26b4ab73265e2"},{"url":"/images/posts/2-darkweb-instrumental-.jpeg","revision":"25b1ed36880f9afef45b6f969ff63f72"},{"url":"/images/pages/pingu.jpg","revision":"fdbcbb8a73099a784a0e39caf322a404"},{"url":"/images/pages/creds.jpg","revision":"c0d61d2dcc2820989b445da52d984a11"},{"url":"/images/pages/phone.jpg","revision":"28c71c2f34dd924836522ea99a0330b0"},{"url":"/images/pages/jack-hamilton-CMnNiQBkwBI-unsplash.jpg","revision":"05b685c77386c247340abecb8eaf3218"},{"url":"/images/pages/arget-zvhhkivur9m-unsplash.jpg","revision":"e80d8b7d0899415327d46c345e95571e"},{"url":"/images/pages/kaur-kristjan-cppf4w5pb1c-unsplash.jpg","revision":"982d5e7565ea6fb7211305c12048a94e"},{"url":"/images/pages/4-darkweb-instrumental-.jpeg","revision":"25b1ed36880f9afef45b6f969ff63f72"},{"url":"/index.html","revision":"d5200ebee78f8be437a5fe2668404b59"},{"url":"/333mix/","revision":"6acd43ac354a52d3248f8ea9dc36405d"},{"url":"/unmet-dependencies/","revision":"abf15a089c9232faa369fb4e5f13b50d"},{"url":"/live-with-hardware/","revision":"ce07900a964783eda05d0515d169d5d1"},{"url":"/cyber-grany/","revision":"e78f9e99f3e2c609d1545ba7f7d3c848"},{"url":"/darkweb/","revision":"3f3333f1ddfbec03dd8194e2745f3ffe"}];
|
||||||
|
// service-worker.js
|
||||||
|
|
||||||
|
// set names for both precache & runtime cache
|
||||||
|
workbox.core.setCacheNameDetails({
|
||||||
|
prefix: 'SettoPWA',
|
||||||
|
suffix: 'v1',
|
||||||
|
precache: 'precache',
|
||||||
|
runtime: 'runtime-cache'
|
||||||
|
});
|
||||||
|
|
||||||
|
// let Service Worker take control of pages ASAP
|
||||||
|
workbox.skipWaiting();
|
||||||
|
workbox.clientsClaim();
|
||||||
|
|
||||||
|
// let Workbox handle our precache list
|
||||||
|
workbox.precaching.precacheAndRoute(self.__precacheManifest);
|
||||||
|
|
||||||
|
// use `networkFirst` strategy for `*.html`, like all my posts
|
||||||
|
workbox.routing.registerRoute(
|
||||||
|
/\.html$/,
|
||||||
|
workbox.strategies.networkFirst()
|
||||||
|
);
|
||||||
|
|
||||||
|
// use `cacheFirst` strategy for images
|
||||||
|
workbox.routing.registerRoute(
|
||||||
|
/assets\/(img|icons|css)/,
|
||||||
|
workbox.strategies.cacheFirst()
|
||||||
|
);
|
||||||
|
workbox.routing.registerRoute(
|
||||||
|
/videos/,
|
||||||
|
workbox.strategies.cacheFirst()
|
||||||
|
);
|
||||||
|
workbox.routing.registerRoute(
|
||||||
|
/images\/(posts|pages)/,
|
||||||
|
workbox.strategies.cacheFirst()
|
||||||
|
);
|
||||||
|
// third party files
|
||||||
|
workbox.routing.registerRoute(
|
||||||
|
/^https?:\/\/media.basspistol.com/,
|
||||||
|
workbox.strategies.staleWhileRevalidate()
|
||||||
|
);
|
BIN
setto-webapp.png
Normal file
After Width: | Height: | Size: 61 KiB |
|
@ -66,7 +66,7 @@
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://setto.basspistol.com/about/</loc>
|
<loc>https://setto.basspistol.com/about/</loc>
|
||||||
<lastmod>2020-07-27T10:30:14+00:00</lastmod>
|
<lastmod>2020-08-05T17:06:29+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://setto.basspistol.com/discography/</loc>
|
<loc>https://setto.basspistol.com/discography/</loc>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://setto.basspistol.com/</loc>
|
<loc>https://setto.basspistol.com/</loc>
|
||||||
<lastmod>2020-08-05T09:18:47+00:00</lastmod>
|
<lastmod>2020-08-05T17:06:29+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://setto.basspistol.com/links/</loc>
|
<loc>https://setto.basspistol.com/links/</loc>
|
||||||
|
|
20
sw-register.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
if ('serviceWorker' in navigator) {
|
||||||
|
navigator.serviceWorker.register('/service-worker.js?v=1596647193').then(function(reg) {
|
||||||
|
reg.onupdatefound = function() {
|
||||||
|
var installingWorker = reg.installing;
|
||||||
|
installingWorker.onstatechange = function() {
|
||||||
|
switch (installingWorker.state) {
|
||||||
|
case 'installed':
|
||||||
|
if (navigator.serviceWorker.controller) {
|
||||||
|
var event = document.createEvent('Event');
|
||||||
|
event.initEvent('sw.update', true, true);
|
||||||
|
window.dispatchEvent(event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}).catch(function(e) {
|
||||||
|
console.error('Error during service worker registration:', e);
|
||||||
|
});
|
||||||
|
}
|
|
@ -110,6 +110,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -615,7 +618,7 @@ Open your mind, open the source!</p>
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -740,7 +743,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -759,7 +762,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -792,5 +795,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,9 @@
|
||||||
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
<link rel="icon" type="image/png" href="https://setto.basspistol.com/touch-icon.png" sizes="192x192">
|
||||||
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
<link rel="shortcut icon" href="https://setto.basspistol.com/images/setto-logoicon.svg" type="image/png" />
|
||||||
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
<noscript><link rel="stylesheet" href="../assets/css/noscripts-20200805.css" /></noscript>
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<meta name="theme-color" content="#3c2a52"/>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -248,7 +251,7 @@
|
||||||
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
<a target="_blank" alt="徒 setto セット on Reddit" title="徒 setto セット on Reddit" rel="noopener"
|
||||||
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
href="https://www.reddit.com/r/basspistol" class="icon small fab fa-reddit"><span class="label">Reddit</span></a>
|
||||||
|
|
||||||
<a target="_blank" alt="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
<a target="_blank" alt="email" title="email" href="mailto:setto@basspistol.com" class="icon small fas fa-envelope-open-text"><span
|
||||||
class="label">Email</span></a>
|
class="label">Email</span></a>
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
|
@ -373,7 +376,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
@ -392,7 +395,7 @@ _paq.push(['enableLinkTracking']);
|
||||||
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
_paq.push(['setSiteId', '11']);
|
_paq.push(['setSiteId', '11']);
|
||||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src='//cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
g.type='text/javascript'; g.async=true; g.defer=true; g.src='https://cdn.matomo.cloud/terminalnetwork.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -425,5 +428,18 @@ _paq.push(['enableLinkTracking']);
|
||||||
|
|
||||||
<script src="../assets/js/set-20200805.js"></script>
|
<script src="../assets/js/set-20200805.js"></script>
|
||||||
|
|
||||||
</body>
|
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
var firstScript = document.getElementsByTagName('script')[0];
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.async = true;
|
||||||
|
script.src = '/sw-register.js?v=' + Date.now();
|
||||||
|
firstScript.parentNode.insertBefore(script, firstScript);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|