From c5a7f46a065dba3604ef4d515b5f80c6456725b5 Mon Sep 17 00:00:00 2001 From: Mario Bruestle Date: Sun, 19 Mar 2023 16:44:53 +0100 Subject: [PATCH] hmmm --- package.json | 5 +- pnpm-lock.yaml | 340 +++++++++++++++++++++++--------- src/app.html | 1 + src/hooks.client.ts | 11 ++ src/hooks.server.ts | 7 - src/service-worker.ts | 41 ++-- static/Momo_Mobile_Icon_160.png | Bin 0 -> 3904 bytes static/manifest.json | 17 ++ 8 files changed, 296 insertions(+), 126 deletions(-) create mode 100644 static/Momo_Mobile_Icon_160.png create mode 100644 static/manifest.json diff --git a/package.json b/package.json index ec1904b..9bc9aa9 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "@tailwindcss/typography": "^0.5.9", "@types/node": "^18.15.3", "@types/pg": "^8.6.6", - "@types/web-push": "^3.3.2", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "autoprefixer": "^10.4.14", @@ -42,11 +41,11 @@ "tweetnacl": "^1.0.3", "typescript": "^4.9.5", "vite": "^4.2.0", - "vitest": "^0.25.8", - "web-push": "^3.5.0" + "vitest": "^0.25.8" }, "type": "module", "dependencies": { + "firebase-messaging": "^1.0.6", "knex": "^2.4.2", "objection": "^3.0.1", "pg": "^8.10.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e047205..15b721f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,6 @@ specifiers: '@tailwindcss/typography': ^0.5.9 '@types/node': ^18.15.3 '@types/pg': ^8.6.6 - '@types/web-push': ^3.3.2 '@typescript-eslint/eslint-plugin': ^5.55.0 '@typescript-eslint/parser': ^5.55.0 autoprefixer: ^10.4.14 @@ -16,6 +15,7 @@ specifiers: eslint-config-prettier: ^8.7.0 eslint-plugin-svelte3: ^4.0.0 firebase: ^9.18.0 + firebase-messaging: ^1.0.6 idb: ^7.1.1 knex: ^2.4.2 objection: ^3.0.1 @@ -32,9 +32,9 @@ specifiers: typescript: ^4.9.5 vite: ^4.2.0 vitest: ^0.25.8 - web-push: ^3.5.0 dependencies: + firebase-messaging: 1.0.6 knex: 2.4.2_pg@8.10.0 objection: 3.0.1_knex@2.4.2 pg: 8.10.0 @@ -46,7 +46,6 @@ devDependencies: '@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7 '@types/node': 18.15.3 '@types/pg': 8.6.6 - '@types/web-push': 3.3.2 '@typescript-eslint/eslint-plugin': 5.55.0_342y7v4tc7ytrrysmit6jo4wri '@typescript-eslint/parser': 5.55.0_vgl77cfdswitgr47lm5swmv43m autoprefixer: 10.4.14_postcss@8.4.21 @@ -68,7 +67,6 @@ devDependencies: typescript: 4.9.5 vite: 4.2.0_@types+node@18.15.3 vitest: 0.25.8 - web-push: 3.5.0 packages: @@ -1118,12 +1116,6 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/web-push/3.3.2: - resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} - dependencies: - '@types/node': 18.15.3 - dev: true - /@typescript-eslint/eslint-plugin/5.55.0_342y7v4tc7ytrrysmit6jo4wri: resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1292,15 +1284,6 @@ packages: hasBin: true dev: true - /agent-base/6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1308,7 +1291,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv/8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -1356,19 +1338,25 @@ packages: engines: {node: '>=8'} dev: true - /asn1.js/5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 - dev: true + dev: false + + /assert-plus/1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: false /assertion-error/1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /autoprefixer/10.4.14_postcss@8.4.21: resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -1385,19 +1373,29 @@ packages: postcss-value-parser: 4.2.0 dev: true + /aws-sign2/0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: false + + /aws4/1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: false + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: false + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /bn.js/4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1433,10 +1431,6 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-equal-constant-time/1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: true - /buffer-writer/2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} @@ -1468,6 +1462,10 @@ packages: resolution: {integrity: sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==} dev: true + /caseless/0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: false + /chai/4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -1546,6 +1544,13 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: false + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /commander/9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -1564,6 +1569,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /core-util-is/1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: false + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -1606,6 +1615,13 @@ packages: - ts-node dev: true + /dashdash/1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: false + /db-errors/0.2.3: resolution: {integrity: sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng==} dev: false @@ -1641,6 +1657,11 @@ packages: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} dev: true + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1687,11 +1708,12 @@ packages: esutils: 2.0.3 dev: true - /ecdsa-sig-formatter/1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + /ecc-jsbn/0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: - safe-buffer: 5.2.1 - dev: true + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false /electron-to-chromium/1.4.333: resolution: {integrity: sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ==} @@ -1884,6 +1906,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /extsprintf/1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: false + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1900,7 +1931,6 @@ packages: /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -1945,6 +1975,12 @@ packages: path-exists: 4.0.0 dev: true + /firebase-messaging/1.0.6: + resolution: {integrity: sha512-OvLBribGo6vfoBwpa+/yGisalKe+RjsPM8Ajycr2N2iL5tdkKLfO+hTfwhltYvcs/IB3JOZsmWplypQtwfVITw==} + dependencies: + request: 2.88.2 + dev: false + /firebase/9.18.0: resolution: {integrity: sha512-CTV5S3mTtn9zodeWkdeTqiQFyS7t+iskA50V9hVKPCQ4TPw4tnoyNgtNzWUmemFnYadzzsTnAaxsR7UaBJgiqw==} dependencies: @@ -1990,6 +2026,19 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /forever-agent/0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: false + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true @@ -2027,6 +2076,12 @@ packages: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} dev: false + /getpass/0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2098,6 +2153,20 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true + /har-schema/2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: false + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: false + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2113,22 +2182,14 @@ packages: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} dev: true - /http_ece/1.1.0: - resolution: {integrity: sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==} - engines: {node: '>=4'} + /http-signature/1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} dependencies: - urlsafe-base64: 1.0.0 - dev: true - - /https-proxy-agent/5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: false /idb/7.0.1: resolution: {integrity: sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==} @@ -2232,10 +2293,18 @@ packages: '@types/estree': 1.0.0 dev: true + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /isstream/0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: false + /js-sdsl/4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true @@ -2247,32 +2316,38 @@ packages: argparse: 2.0.1 dev: true + /jsbn/0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: false + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: false + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false + /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /jwa/2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: true + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false - /jws/4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + /jsprim/1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} dependencies: - jwa: 2.0.0 - safe-buffer: 5.2.1 - dev: true + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: false /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} @@ -2430,6 +2505,18 @@ packages: picomatch: 2.3.1 dev: true + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /mime/3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -2441,10 +2528,6 @@ packages: engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2522,6 +2605,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: false + /object-hash/3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -2608,6 +2695,10 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /performance-now/2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + /pg-connection-string/2.5.0: resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} dev: false @@ -2838,10 +2929,19 @@ packages: long: 5.2.1 dev: true + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + /punycode/2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: false + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -2871,6 +2971,33 @@ packages: resolve: 1.22.1 dev: false + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: false + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2941,11 +3068,10 @@ packages: /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + dev: false /sander/0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} @@ -3025,6 +3151,22 @@ packages: engines: {node: '>= 10.x'} dev: false + /sshpk/1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + /streamsearch/1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3245,6 +3387,14 @@ packages: engines: {node: '>=6'} dev: true + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: false + /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true @@ -3298,6 +3448,16 @@ packages: typescript: 4.9.5 dev: true + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /tweetnacl/0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: false + /tweetnacl/1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: true @@ -3348,18 +3508,29 @@ packages: dependencies: punycode: 2.3.0 - /urlsafe-base64/1.0.0: - resolution: {integrity: sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA==} - dev: true - /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /verror/1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + /vite/4.2.0_@types+node@18.15.3: resolution: {integrity: sha512-AbDTyzzwuKoRtMIRLGNxhLRuv1FpRgdIw+1y6AQG73Q5+vtecmvzKo/yk8X/vrHDpETRTx01ABijqUHIzBXi0g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3450,21 +3621,6 @@ packages: - terser dev: true - /web-push/3.5.0: - resolution: {integrity: sha512-JC0V9hzKTqlDYJ+LTZUXtW7B175qwwaqzbbMSWDxHWxZvd3xY0C2rcotMGDavub2nAAFw+sXTsqR65/KY2A5AQ==} - engines: {node: '>= 6'} - hasBin: true - dependencies: - asn1.js: 5.4.1 - http_ece: 1.1.0 - https-proxy-agent: 5.0.1 - jws: 4.0.0 - minimist: 1.2.8 - urlsafe-base64: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true diff --git a/src/app.html b/src/app.html index effe0d0..318a1c2 100644 --- a/src/app.html +++ b/src/app.html @@ -4,6 +4,7 @@ + %sveltekit.head% diff --git a/src/hooks.client.ts b/src/hooks.client.ts index 17e102e..cdd96f3 100644 --- a/src/hooks.client.ts +++ b/src/hooks.client.ts @@ -37,3 +37,14 @@ const createRoom = (roomName: string) => { ], } } + +async function requestNotificationPermission() { + const permission = await Notification.requestPermission() + if (permission !== 'granted') { + console.error('Notification permission not granted') + return false + } + return true +} + +requestNotificationPermission() diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 06d218a..b76e94b 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,6 +1,5 @@ import Knex from 'knex' import { Model } from 'objection' -import { setVapidDetails } from 'web-push' const knex = Knex({ client: 'pg', @@ -20,9 +19,3 @@ const vapidKeys = { 'BEovcVTe3AmMJ8fpMahQqjr2shW74zBW6Imvih274_03nJg9m4hhUIAPc2Ur0_2aryAOXCA9eEulplz2y0CLfwY', privateKey: 'DUT4Fn5r293-e5gTvpgiQtpU5yhjgwASulFZZclFaJg', } - -setVapidDetails( - 'mailto:mario.bruestle@pm.me', - vapidKeys.publicKey, - vapidKeys.privateKey, -) diff --git a/src/service-worker.ts b/src/service-worker.ts index ac47567..eb1f0f8 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -111,19 +111,9 @@ sw.addEventListener('activate', activateListener) sw.addEventListener('fetch', fetchListener) sw.addEventListener('backgroundfetch', backgroundFetchListener) -async function requestNotificationPermission() { - const permission = await Notification.requestPermission() - if (permission !== 'granted') { - console.error('Notification permission not granted') - return false - } - return true -} - -requestNotificationPermission() - import { initializeApp } from 'firebase/app' -import firebase from 'firebase/compat' +import { onBackgroundMessage } from 'firebase/messaging/sw' +import { getMessaging, isSupported, getToken } from 'firebase/messaging' // Your web app's Firebase configuration const firebaseConfig = { @@ -135,20 +125,23 @@ const firebaseConfig = { appId: '1:650934549094:web:48a55d718de5b3c7a64ba7', } const app = initializeApp(firebaseConfig) -const messaging = firebase.messaging() -async function requestNotificationPermissionAndToken(): Promise { - const permissionGranted = await requestNotificationPermission() - if (!permissionGranted) return null +const messaging = async () => { + console.log('hmm????', await isSupported()) + if (await isSupported()) { + const messaging = getMessaging(app) + + onBackgroundMessage(messaging, (payload) => { + // Customize notification here + const notificationTitle = 'Background Message Title' + const notificationOptions = { + body: 'Background Message body', + } - try { - const token = await messaging.getToken({ - vapidKey: - 'BEovcVTe3AmMJ8fpMahQqjr2shW74zBW6Imvih274_03nJg9m4hhUIAPc2Ur0_2aryAOXCA9eEulplz2y0CLfwY', + sw.registration.showNotification(notificationTitle, notificationOptions) }) - return token - } catch (error) { - console.error('Failed to get the registration token:', error) - return null + console.log('hmm?') + console.log(await getToken(messaging)) } } +messaging() diff --git a/static/Momo_Mobile_Icon_160.png b/static/Momo_Mobile_Icon_160.png new file mode 100644 index 0000000000000000000000000000000000000000..5bceb59a0d109fb58faad30d7babe879c90e7d7d GIT binary patch literal 3904 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