{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c57-7cb2-a431-1750fd926dfc","file":"qL9MvFWv.mjs","mappings":"wVAKA,SAASA,EAAsBC,EAA4B,CAC1D,MAAMC,EAAU,IAAI,QAAQ,EAAKD,EAAO,OAAS,GAAM,CAAC,EAClDE,GAAOF,EAASC,GAAS,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EAC7DE,EAAM,KAAKD,CAAG,EACdE,EAAM,IAAI,WAAWD,EAAI,MAAM,EACrC,QAASE,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAAKD,EAAIC,CAAC,EAAIF,EAAI,WAAWE,CAAC,EAC9D,OAAOD,CACR,CAIO,SAASE,GAAyB,CACxC,MACY,kBAAmB,WAAa,gBAAiB,QAAU,iBAAkB,MAE1F,CAEO,SAASC,GAAiC,CAChD,OAAKD,EAAA,EACE,aAAa,WADS,aAE9B,CAIA,eAAsBE,GAAsC,CAC3D,GAAI,CAACF,EAAA,EAAiB,MAAO,cAC7B,MAAMG,EAAMC,EAAI,wBAChB,GAAI,CAACD,EAAK,MAAO,cAEjB,MAAME,EAAa,MAAM,aAAa,kBAAA,EACtC,GAAIA,IAAe,UAAW,OAAOA,EAErC,MAAMC,EAAM,MAAM,UAAU,cAAc,MAC1C,IAAIC,EAAM,MAAMD,EAAI,YAAY,gBAAA,EAC3BC,IACJA,EAAM,MAAMD,EAAI,YAAY,UAAU,CACrC,gBAAiB,GACjB,qBAAsBb,EAAsBU,CAAG,CAAA,CAC/C,GAGF,MAAMK,EAAOD,EAAI,OAAA,EACjB,aAAM,MAAM,sBAAuB,CAClC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CACpB,SAAUA,EAAI,SACd,OAAQC,EAAK,MAAM,OACnB,KAAMA,EAAK,MAAM,KAIjB,WACC,OAAO,WAAW,4BAA4B,EAAE,SAC/C,UAAmD,aAAe,EAAA,CACpE,CAAA,CACD,EACM,SACR,CAEA,eAAsBC,GAA6B,CAClD,GAAI,CAACT,IAAiB,OAEtB,MAAMO,EAAM,MADA,MAAM,UAAU,cAAc,OACpB,YAAY,gBAAA,EAClC,GAAI,CAACA,EAAK,OACV,MAAMG,EAAWH,EAAI,SACrB,MAAMA,EAAI,cAAc,MAAM,IAAM,CAAC,CAAC,EACtC,MAAM,MAAM,wBAAyB,CACpC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CAAE,SAAAG,EAAU,CAAA,CACjC,EAAE,MAAM,IAAM,CAAC,CAAC,CAClB,CAGA,eAAsBC,GAAiC,CAEtD,OADY,MAAM,MAAM,iBAAkB,CAAE,OAAQ,OAAQ,GACjD,EACZ","names":["urlBase64ToUint8Array","base64","padding","b64","raw","out","i","pushSupported","pushPermission","enablePush","key","env","permission","reg","sub","data","disablePush","endpoint","sendTestPush"],"sources":["../../../../../../src/lib/push-client.ts"],"sourcesContent":["import { browser } from '$app/environment';\nimport { env } from '$env/dynamic/public';\n\n/** base64url VAPID key → the Uint8Array the Push API wants for\n *  applicationServerKey. */\nfunction urlBase64ToUint8Array(base64: string): Uint8Array {\n\tconst padding = '='.repeat((4 - (base64.length % 4)) % 4);\n\tconst b64 = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/');\n\tconst raw = atob(b64);\n\tconst out = new Uint8Array(raw.length);\n\tfor (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n\treturn out;\n}\n\nexport type PushPermission = 'granted' | 'denied' | 'default' | 'unsupported';\n\nexport function pushSupported(): boolean {\n\treturn (\n\t\tbrowser && 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window\n\t);\n}\n\nexport function pushPermission(): PushPermission {\n\tif (!pushSupported()) return 'unsupported';\n\treturn Notification.permission as PushPermission;\n}\n\n/** Request permission (MUST be called from a user gesture), subscribe, and\n *  persist the subscription server-side. Returns the resulting state. */\nexport async function enablePush(): Promise<PushPermission> {\n\tif (!pushSupported()) return 'unsupported';\n\tconst key = env.PUBLIC_VAPID_PUBLIC_KEY;\n\tif (!key) return 'unsupported'; // server not provisioned yet\n\n\tconst permission = await Notification.requestPermission();\n\tif (permission !== 'granted') return permission as PushPermission;\n\n\tconst reg = await navigator.serviceWorker.ready;\n\tlet sub = await reg.pushManager.getSubscription();\n\tif (!sub) {\n\t\tsub = await reg.pushManager.subscribe({\n\t\t\tuserVisibleOnly: true,\n\t\t\tapplicationServerKey: urlBase64ToUint8Array(key) as BufferSource\n\t\t});\n\t}\n\n\tconst data = sub.toJSON();\n\tawait fetch('/api/push/subscribe', {\n\t\tmethod: 'POST',\n\t\theaders: { 'content-type': 'application/json' },\n\t\tbody: JSON.stringify({\n\t\t\tendpoint: sub.endpoint,\n\t\t\tp256dh: data.keys?.p256dh,\n\t\t\tauth: data.keys?.auth,\n\t\t\t// Installed-app check. display-mode covers Android/desktop; iOS\n\t\t\t// Safari predates it for home-screen apps and exposes the legacy\n\t\t\t// navigator.standalone instead.\n\t\t\tstandalone:\n\t\t\t\twindow.matchMedia('(display-mode: standalone)').matches ||\n\t\t\t\t(navigator as Navigator & { standalone?: boolean }).standalone === true\n\t\t})\n\t});\n\treturn 'granted';\n}\n\nexport async function disablePush(): Promise<void> {\n\tif (!pushSupported()) return;\n\tconst reg = await navigator.serviceWorker.ready;\n\tconst sub = await reg.pushManager.getSubscription();\n\tif (!sub) return;\n\tconst endpoint = sub.endpoint;\n\tawait sub.unsubscribe().catch(() => {});\n\tawait fetch('/api/push/unsubscribe', {\n\t\tmethod: 'POST',\n\t\theaders: { 'content-type': 'application/json' },\n\t\tbody: JSON.stringify({ endpoint })\n\t}).catch(() => {});\n}\n\n/** Dev/self test: ping yourself, no second account needed. */\nexport async function sendTestPush(): Promise<boolean> {\n\tconst res = await fetch('/api/push/test', { method: 'POST' });\n\treturn res.ok;\n}\n"],"version":3}