

// cache名, 在控制台Application的CaChe下可以看到
const cacheName = "penueling";
// cache文件
const cacheFiles = ["/index.html", "/manifest.json"];

var offlineExclude = [
  '/api/',
];



self.addEventListener('push', function (event) {
  console.log('[Service Worker] Push Received.');
  console.log(`[Service Worker] Push had this data: "${event.data.text()}"`)
  let data = JSON.parse(event.data.text())

  const title = data.notification.title || '';
  const options = {
    body: data.notification.body,
    icon: data.notification.image || '',
    badge: data.notification.image || ''
  };

  event.waitUntil(self.registration.showNotification(title, options));
});
self.addEventListener('notificationclick', function (event) {
  console.log('[Service Worker] Notification click Received.');

  event.notification.close();

  event.waitUntil(
    clients.openWindow('https://www.18n.com/')
  );
});

/**
 * 安装 Service Worker
 * install事件是 Service Worker 执行的第一个事件，同一个 Service Worker 只会调用一次
 * 即使 Service Worker 脚本文件只有一个字节不同，浏览器也将视为一个新的 Service Worker
 */
self.addEventListener("install", e => {
  e.waitUntil(
    caches.open(cacheName).then(cache => {
      return cache.addAll(cacheFiles);
    }),
  );
});

/**
//  * 激活 Service Worker
//  * Service Worker 安装成功之后,会触发activate事件
//  * 在这个阶段我们一般做一些清理旧缓存相关的工作
//  */
// self.addEventListener("activate", (e) => {
//   // e.waitUntil(caches.delete(cacheName));
//   e.waitUntil(
//     caches
//       .keys()
//       .then((keys) => {
//         return Promise.all(
//           keys.map((key) => {
//             // 清理缓存
//             if (cacheName !== key) {
//               return caches.delete(key);
//             }
//           })
//         );
//       })
//       .then(() => {
//         console.log("cache deleted");
//       })
//   );
// });

self.addEventListener("fetch", e => {
  if (e.request.cache === 'only-if-cached' && e.request.mode !== 'same-origin') {
    return false
  }
  for (let i = 0; i < offlineExclude.length; i++) {
    if (e.request.url.indexOf(offlineExclude[i]) !== -1) return false;
  }
  var u = e.request.url.replace('https://', '')


  var n = u.indexOf('/')
  if (u.slice(n, 60).indexOf('.') == -1) {
    return false;
  }
  e.respondWith(
    caches.match(e.request).then((response) => response || fetch(e.request)),
  );
});