-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
service-worker.js
232 lines (207 loc) · 8.33 KB
/
service-worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
const CACHE_NAME = 'sos';
const staticAssets = [
'/',
'/index.html',
'/offline.html',
'/404.html',
'/assets/main.js',
'/assets/prism.js',
'/assets/fonts/Inter-Bold.woff2',
'/assets/fonts/Inter-BoldItalic.woff2',
'/assets/fonts/Inter-Italic.woff2',
'/assets/fonts/Inter-Medium.woff2',
'/assets/fonts/Inter-MediumItalic.woff2',
'/assets/fonts/Inter-Regular.woff2',
'/js/ping.js',
'/js/search.js',
'/style-append.min.css',
'/img/apple-touch-icon-192.png'
];
const OFFLINE_URL = '/offline.html'; // Define the URL of the offline page
self.addEventListener('install', function (event) {
console.log('[ServiceWorker] Install');
event.waitUntil((async () => {
const cache = await caches.open(CACHE_NAME);
await cache.addAll(staticAssets);
})());
self.skipWaiting();
});
self.addEventListener('activate', (event) => {
console.log('[ServiceWorker] Activate');
event.waitUntil((async () => {
// Enable navigation preload if it's supported.
// See https://developers.google.com/web/updates/2017/02/navigation-preload
if ('navigationPreload' in self.registration) {
await self.registration.navigationPreload.enable();
}
return self.clients.claim();
})());
// Tell the active service worker to take control of the page immediately.
self.clients.claim();
});
self.addEventListener('fetch', function (event) {
if (event.request.mode === 'navigate' || staticAssets.includes(event.request.url)) {
event.respondWith((async () => {
try {
const preloadResponse = await event.preloadResponse;
if (preloadResponse) {
return preloadResponse;
}
const networkResponse = await fetch(event.request);
if (networkResponse.status === 200 && networkResponse.type === 'basic') {
const cache = await caches.open(CACHE_NAME);
cache.put(event.request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
console.log('[Service Worker] Fetch failed; returning offline page instead.', error);
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(OFFLINE_URL);
return cachedResponse;
}
})());
}
});
// let stoprss = false;
// const fetchRss = async () => {
// const rssUrl = 'https://simeononsecurity.com/rss.xml';
// let parser;
// if (typeof window !== "undefined" && typeof window.DOMParser !== "undefined") {
// parser = new window.DOMParser();
// console.log('DOMParser is Window');
// } else if (typeof self !== "undefined" && typeof self.DOMParser !== "undefined") {
// parser = new self.DOMParser();
// console.log('DOMParser is Self');
// } else {
// // handle the error here, such as logging a message or throwing an exception
// console.error("The DOMParser is not available in this context");
// stoprss = true;
// return;
// }
// try {
// let response = await fetch(rssUrl);
// console.log(response);
// let text = await response.text();
// console.log(text);
// let xml = parser.parseFromString(text, "text/xml");
// let itemsArray = Array.from(xml.getElementsByTagName("item"));
// let rssData = itemsArray.map(item =>
// ({title: item.getElementsByTagName("title")[0].innerText,
// link: item.getElementsByTagName("link")[0].innerText }));
// return rssData;
// console.log(rssData);
// return rssData;
// } catch (error) {
// console.error(`Failed to fetch RSS data: ${error}`);
// console.error(error.stack);
// return null;
// }
// };
// setInterval(async () => {
// if (stoprss != true) {
// const rssData = await fetchRss();
// if (rssData) {
// const lastPost = rssData[0];
// if (lastPost) {
// // Check if this is a new post compared to what we have stored locally
// const localLastPost = localStorage.getItem('lastPost');
// if (!localLastPost || lastPost.title !== localLastPost) {
// localStorage.setItem('lastPost', lastPost.title);
// // Trigger the push event to show the notification
// self.dispatchEvent(new PushEvent('push', {
// data: lastPost
// }));
// }
// }
// }
// }
// }, 60000);
// https://geekflare.com/convert-webapp-to-pwa/
// self.addEventListener('push', event => {
// const data = event.data.json();
// const options = {
// body: `${data.title}`,
// badge: '/img/apple-touch-icon-192.png'
// };
// event.waitUntil(self.registration.showNotification('New Post', options));
// });
// if ('Notification' in window && Notification.permission != 'granted') {
// console.log('Ask user permission')
// Notification.requestPermission(status => {
// console.log('Status:'+status)
// displayNotification('Notification Enabled');
// });
// }
// const displayNotification = notificationTitle => {
// console.log('display notification')
// if (Notification.permission == 'granted') {
// navigator.serviceWorker.getRegistration().then(reg => {
// console.log(reg)
// const options = {
// body: 'Thanks for allowing push notification !',
// icon: '/img/apple-touch-icon-144-precomposed.png',
// vibrate: [100, 50, 100],
// data: {
// dateOfArrival: Date.now(),
// primaryKey: 0
// }
// };
// reg.showNotification(notificationTitle, options);
// });
// }
// };
// const updateSubscriptionOnYourServer = subscription => {
// console.log('Write your ajax code here to save the user subscription in your DB', subscription);
// // write your own ajax request method using fetch, jquery, axios to save the subscription in your server for later use.
// };
// const subscribeUser = async () => {
// const swRegistration = await navigator.serviceWorker.getRegistration();
// const applicationServerPublicKey = ''; // paste your webpush certificate public key
// const applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey);
// swRegistration.pushManager.subscribe({
// userVisibleOnly: true,
// applicationServerKey
// })
// .then((subscription) => {
// console.log('User is subscribed newly:', subscription);
// updateSubscriptionOnServer(subscription);
// })
// .catch((err) => {
// if (Notification.permission === 'denied') {
// console.warn('Permission for notifications was denied')
// } else {
// console.error('Failed to subscribe the user: ', err)
// }
// });
// };
// const urlB64ToUint8Array = (base64String) => {
// const padding = '='.repeat((4 - base64String.length % 4) % 4)
// const base64 = (base64String + padding)
// .replace(/\-/g, '+')
// .replace(/_/g, '/')
// const rawData = window.atob(base64);
// const outputArray = new Uint8Array(rawData.length);
// for (let i = 0; i < rawData.length; ++i) {
// outputArray[i] = rawData.charCodeAt(i);
// }
// return outputArray;
// };
// const checkSubscription = async () => {
// const swRegistration = await navigator.serviceWorker.getRegistration();
// swRegistration.pushManager.getSubscription()
// .then(subscription => {
// if (!!subscription) {
// console.log('User IS Already subscribed.');
// updateSubscriptionOnYourServer(subscription);
// } else {
// console.log('User is NOT subscribed. Subscribe user newly');
// subscribeUser();
// }
// });
// };
// checkSubscription();
// self.addEventListener('push', (event) => {
// const json = JSON.parse(event.data.text())
// console.log('Push Data', event.data.text())
// self.registration.showNotification(json.header, json.options)
// });