UNPKG

vibetunnel

Version:

Terminal sharing server with web interface - supports macOS, Linux, and headless environments

2 lines (1 loc) 3.06 kB
(()=>{var r="vibetunnel-";self.addEventListener("install",t=>{console.log("[SW] Installing service worker"),self.skipWaiting()});self.addEventListener("activate",t=>{console.log("[SW] Activating service worker"),t.waitUntil(self.clients.claim())});self.addEventListener("push",t=>{if(console.log("[SW] Push event received"),!t.data){console.warn("[SW] Push event has no data");return}let i;try{i=t.data.json()}catch(o){console.error("[SW] Failed to parse push payload:",o);return}t.waitUntil(f(i))});self.addEventListener("notificationclick",t=>{console.log("[SW] Notification clicked:",t.notification.tag),t.notification.close();let i=t.notification.data;t.waitUntil(u(t.action,i))});self.addEventListener("notificationclose",t=>{console.log("[SW] Notification closed:",t.notification.tag);let i=t.notification.data;i.type==="session-exit"||i.type});async function f(t){let{title:i,body:o,icon:s,badge:n,data:e,actions:c,tag:l,requireInteraction:d}=t;try{let a={body:o,icon:s||"/apple-touch-icon.png",badge:n||"/favicon-32.png",data:e,tag:l||`${r}${e.type}-${Date.now()}`,requireInteraction:d||e.type==="session-error",silent:!1,renotify:!0,actions:c||m(e),timestamp:e.timestamp};"vibrate"in navigator&&(a.vibrate=g(e.type)),await self.registration.showNotification(i,a),console.log("[SW] Notification shown:",i)}catch(a){console.error("[SW] Failed to show notification:",a)}}function m(t){let i=[{action:"dismiss",title:"Dismiss"}];switch(t.type){case"session-exit":case"session-error":case"session-start":case"command-finished":case"command-error":return[{action:"view-session",title:"View Session"},...i];case"system-alert":return[{action:"view-logs",title:"View Logs"},...i];default:return i}}function g(t){switch(t){case"session-error":case"command-error":return[200,100,200,100,200];case"session-exit":return[100,50,100];case"session-start":return[50];case"command-finished":return[75,50,75];case"system-alert":return[150,75,150];default:return[100]}}async function u(t,i){let o=await self.clients.matchAll({type:"window",includeUncontrolled:!0});for(let n of o)if(n.url.includes(self.location.origin))try{await n.focus(),n.postMessage({type:"notification-action",action:t,data:i});return}catch(e){console.warn("[SW] Failed to focus client:",e)}let s=self.location.origin;switch(t){case"view-session":{(i.type==="session-exit"||i.type==="session-error"||i.type==="session-start"||i.type==="command-finished"||i.type==="command-error")&&(s+=`/session/${i.sessionId}`);break}case"view-logs":{s+="/logs";break}default:break}try{await self.clients.openWindow(s)}catch(n){console.error("[SW] Failed to open window:",n)}}self.addEventListener("message",t=>{let{data:i}=t;switch(i.type){case"CLEAR_NOTIFICATIONS":{p();break}case"SKIP_WAITING":{self.skipWaiting();break}}});async function p(){try{let t=await self.registration.getNotifications();for(let i of t)i.tag?.startsWith(r)&&i.close();console.log("[SW] Cleared all VibeTunnel notifications")}catch(t){console.error("[SW] Failed to clear notifications:",t)}}console.log("[SW] Service worker loaded");})();