@colyseus/social
Version:
Authentication and Social features for Colyseus
86 lines (72 loc) • 2.49 kB
JavaScript
const BACKEND_URL = "[BACKEND_URL]";
const urlB64ToUint8Array = base64String => {
const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, "+")
.replace(/_/g, "/");
const rawData = atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
};
const saveSubscription = async subscription => {
const response = await fetch(`${BACKEND_URL}/subscribe`, {
method: "post",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(subscription)
});
return response.json();
};
const getApplicationServerKey = async () => {
const response = await fetch(`${BACKEND_URL}/web`, {
method: "get",
headers: { "Content-Type": "application/json" }
});
return response.json();
}
self.addEventListener("install", async () => {
try {
const serverKey = await getApplicationServerKey();
const applicationServerKey = urlB64ToUint8Array(serverKey.publicKey);
const options = { applicationServerKey, userVisibleOnly: true };
const subscription = await self.registration.pushManager.subscribe(options);
const response = await saveSubscription(subscription);
} catch (err) {
console.log("Error", err);
}
});
self.addEventListener("push", function(event) {
if (event.data) {
const data = event.data.json();
if (Notification.permission === "granted") {
// show notification
self.registration.showNotification(data.title, data);
}
} else {
console.log("Push event but no data");
}
});
self.addEventListener('notificationclick', function (event) {
const FRONTEND_URL = location.origin;
// Android doesn't close the notification when you click on it
// See: http://crbug.com/463146
event.notification.close();
event.waitUntil(
clients.matchAll({ type: 'window' }).then(windowClients => {
// Check if there is already a window/tab open with the target URL
for (var i = 0; i < windowClients.length; i++) {
var client = windowClients[i];
// If so, just focus it.
if (client.url.indexOf(FRONTEND_URL) >= 0 && 'focus' in client) {
return client.focus();
}
}
// If not, then open the target URL in a new window/tab.
if (clients.openWindow) {
return clients.openWindow(FRONTEND_URL);
}
})
);
});