aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Utility
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-08-24 03:05:43 -0700
committerFuwn <[email protected]>2024-08-24 03:05:43 -0700
commitc654c46477602b162b931689902ecd09f574fbb1 (patch)
tree8a8c2db5314f52a344c3dff96dc5145e897f697d /src/lib/Utility
parentrefactor(Data): rename database references (diff)
downloaddue.moe-c654c46477602b162b931689902ecd09f574fbb1.tar.xz
due.moe-c654c46477602b162b931689902ecd09f574fbb1.zip
feat(notifications): fingerprint for multiple grants
Diffstat (limited to 'src/lib/Utility')
-rw-r--r--src/lib/Utility/fingerprint.ts14
-rw-r--r--src/lib/Utility/notifications.ts8
2 files changed, 19 insertions, 3 deletions
diff --git a/src/lib/Utility/fingerprint.ts b/src/lib/Utility/fingerprint.ts
new file mode 100644
index 00000000..d526d332
--- /dev/null
+++ b/src/lib/Utility/fingerprint.ts
@@ -0,0 +1,14 @@
+export const getFingerprint = () =>
+ btoa(
+ `${(() => {
+ const gl = new OffscreenCanvas(0, 0).getContext('webgl');
+
+ if (!gl) return 'none';
+
+ const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
+
+ return debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : 'unknown';
+ })()}-${
+ navigator === null || navigator === void 0 ? void 0 : navigator.hardwareConcurrency
+ }-${new Date().getTimezoneOffset()}`
+ );
diff --git a/src/lib/Utility/notifications.ts b/src/lib/Utility/notifications.ts
index 6356650c..44fa0dd7 100644
--- a/src/lib/Utility/notifications.ts
+++ b/src/lib/Utility/notifications.ts
@@ -1,17 +1,18 @@
import { env } from '$env/dynamic/public';
+import { getFingerprint } from './fingerprint';
import root from './root';
export const requestNotifications = async () => {
- if ('Notification' in window && navigator.serviceWorker)
+ if ('Notification' in window && navigator.serviceWorker) {
if ((await Notification.requestPermission()) === 'granted') {
const pushSubscription = await (
await navigator.serviceWorker.ready
).pushManager.subscribe({
- userVisibleOnly: false,
+ userVisibleOnly: true,
applicationServerKey: env.PUBLIC_VAPID_PUBLIC_KEY
});
- await fetch(root('/api/notifications/subscribe'), {
+ await fetch(root(`/api/notifications/subscribe?p=${getFingerprint()}`), {
method: 'POST',
headers: {
'Content-Type': 'application/json'
@@ -19,4 +20,5 @@ export const requestNotifications = async () => {
body: JSON.stringify(pushSubscription)
});
}
+ }
};