mirror of
https://github.com/discourse/discourse.git
synced 2024-11-28 02:43:44 +08:00
af4938baf1
This reverts commit e3de45359f
.
We need to improve out strategy by adding a cache breaker with this change ... some assets on CDNs and clients may have incorrect CORS headers which can cause stuff to break.
107 lines
3.1 KiB
Plaintext
107 lines
3.1 KiB
Plaintext
'use strict';
|
|
|
|
importScripts("<%= "#{Discourse.asset_host}#{Discourse.base_path}/javascripts/workbox/workbox-sw.js" %>");
|
|
|
|
workbox.setConfig({
|
|
modulePathPrefix: "<%= "#{Discourse.asset_host}#{Discourse.base_path}/javascripts/workbox" %>",
|
|
debug: false
|
|
});
|
|
|
|
var authUrl = "<%= Discourse.base_path %>/auth/";
|
|
|
|
var cacheVersion = "1";
|
|
|
|
// Cache all GET requests, so Discourse can be used while offline
|
|
workbox.routing.registerRoute(
|
|
function(args) {
|
|
return !(args.url.origin === location.origin && args.url.pathname.startsWith(authUrl));
|
|
}, // Match all except auth routes
|
|
new workbox.strategies.NetworkFirst({ // This will only use the cache when a network request fails
|
|
cacheName: "discourse-" + cacheVersion,
|
|
plugins: [
|
|
new workbox.expiration.Plugin({
|
|
maxAgeSeconds: 7* 24 * 60 * 60, // 7 days
|
|
maxEntries: 500,
|
|
purgeOnQuotaError: true, // safe to automatically delete if exceeding the available storage
|
|
}),
|
|
],
|
|
})
|
|
);
|
|
|
|
var idleThresholdTime = 1000 * 10; // 10 seconds
|
|
var lastAction = -1;
|
|
|
|
function isIdle() {
|
|
return lastAction + idleThresholdTime < Date.now();
|
|
}
|
|
|
|
function showNotification(title, body, icon, badge, tag, baseUrl, url) {
|
|
var notificationOptions = {
|
|
body: body,
|
|
icon: icon,
|
|
badge: badge,
|
|
data: { url: url, baseUrl: baseUrl },
|
|
tag: tag
|
|
}
|
|
|
|
return self.registration.showNotification(title, notificationOptions);
|
|
}
|
|
|
|
self.addEventListener('push', function(event) {
|
|
var payload = event.data.json();
|
|
if(!isIdle() && payload.hide_when_active) {
|
|
return false;
|
|
}
|
|
|
|
event.waitUntil(
|
|
self.registration.getNotifications({ tag: payload.tag }).then(function(notifications) {
|
|
if (notifications && notifications.length > 0) {
|
|
notifications.forEach(function(notification) {
|
|
notification.close();
|
|
});
|
|
}
|
|
|
|
return showNotification(payload.title, payload.body, payload.icon, payload.badge, payload.tag, payload.base_url, payload.url);
|
|
})
|
|
);
|
|
});
|
|
|
|
self.addEventListener('notificationclick', function(event) {
|
|
// Android doesn't close the notification when you click on it
|
|
// See: http://crbug.com/463146
|
|
event.notification.close();
|
|
var url = event.notification.data.url;
|
|
var baseUrl = event.notification.data.baseUrl;
|
|
|
|
// This looks to see if the current window is already open and
|
|
// focuses if it is
|
|
event.waitUntil(
|
|
clients.matchAll({ type: "window" })
|
|
.then(function(clientList) {
|
|
var reusedClientWindow = clientList.some(function(client) {
|
|
if (client.url === baseUrl + url && 'focus' in client) {
|
|
client.focus();
|
|
return true;
|
|
}
|
|
|
|
if ('postMessage' in client && 'focus' in client) {
|
|
client.focus();
|
|
client.postMessage({ url: url });
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
if (!reusedClientWindow && clients.openWindow) return clients.openWindow(baseUrl + url);
|
|
})
|
|
);
|
|
});
|
|
|
|
self.addEventListener('message', function(event) {
|
|
if('lastAction' in event.data){
|
|
lastAction = event.data.lastAction;
|
|
}});
|
|
<% DiscoursePluginRegistry.service_workers.each do |js| %>
|
|
<%=raw "#{File.read(js)}" %>
|
|
<% end %>
|