svelte-statusable
Version:
Super tiny, simple to use SvelteJS store to control your application status.
1 lines • 5.56 kB
Source Map (JSON)
{"version":3,"file":"index.min.mjs","sources":["../src/index.js"],"sourcesContent":["import { readable } from 'svelte/store';\n\nconst hasWindow = typeof window !== 'undefined';\nconst hasNavigator = typeof navigator !== 'undefined';\nconst hasDocument = typeof document !== 'undefined';\nconst hasEventSource = typeof EventSource !== 'undefined';\nconst hasAbortController = typeof AbortController !== 'undefined';\nconst defaultRetry = 10000;\n\nfunction setIntervalImmediately(func, interval) {\n\tfunc();\n\treturn setInterval(func, interval);\n}\n\nfunction heartbeat({ url, abort = 0, payload = false, retry, ...options }) {\n\t/*eslint no-unused-vars: \"off\"*/\n\n\tif (abort && hasAbortController) {\n\t\tconst ac = new AbortController();\n\t\toptions.signal = ac.signal;\n\t\tsetTimeout(() => ac.abort(), abort);\n\t}\n\n\treturn fetch(url, options)\n\t\t.then((res) => (payload ? res.json() : res.type === 'opaque' || res.ok))\n\t\t.catch(() => false);\n}\n\nexport function statusable({ ping, sse }) {\n\tlet value = {\n\t\tonline: hasNavigator ? navigator.onLine : true,\n\t\thidden: hasDocument ? document.hidden : false,\n\t\theartbeat: !hasWindow, // for SSR\n\t\tstream: !hasWindow,\n\t};\n\n\tif (typeof ping === 'string') {\n\t\tping = {\n\t\t\turl: ping,\n\t\t\tmethod: 'HEAD',\n\t\t\tcache: 'no-cache',\n\t\t\tcredentials: 'omit',\n\t\t\treferrerPolicy: 'no-referrer',\n\t\t};\n\t}\n\n\tif (typeof sse === 'string') {\n\t\tsse = {\n\t\t\turl: sse,\n\t\t\twithCredentials: false,\n\t\t};\n\t}\n\n\treturn readable(value, (set) => {\n\t\tif (!hasWindow || !hasNavigator || !hasDocument) return;\n\n\t\tlet es;\n\t\tlet interval;\n\n\t\tfunction assign(key, val) {\n\t\t\tif (value[key] === val) return;\n\t\t\tset((value = { ...value, [key]: val }));\n\t\t}\n\n\t\tfunction online() {\n\t\t\tassign('online', navigator.onLine);\n\t\t}\n\n\t\tfunction visibility() {\n\t\t\tassign('hidden', document.hidden);\n\t\t}\n\n\t\tfunction stream(e) {\n\t\t\tassign('stream', e.target.readyState === EventSource.OPEN);\n\t\t}\n\n\t\tif (sse && hasEventSource) {\n\t\t\tes = new EventSource(sse.url, { withCredentials: sse.withCredentials });\n\t\t\tes.addEventListener('open', stream);\n\t\t\tes.addEventListener('error', stream);\n\n\t\t\tif (sse.event) {\n\t\t\t\tes.addEventListener(sse.event, stream);\n\t\t\t}\n\n\t\t\tassign('stream', es.readyState === EventSource.OPEN);\n\t\t}\n\n\t\tif (ping) {\n\t\t\tinterval = setIntervalImmediately(() => {\n\t\t\t\tif (document.hidden || !navigator.onLine) return;\n\t\t\t\theartbeat(ping).then((heartbeat) => assign('heartbeat', heartbeat));\n\t\t\t}, ping.retry || defaultRetry);\n\t\t}\n\n\t\twindow.addEventListener('online', online);\n\t\twindow.addEventListener('offline', online);\n\t\twindow.addEventListener('visibilitychange', visibility);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('online', online);\n\t\t\twindow.removeEventListener('offline', online);\n\t\t\twindow.removeEventListener('visibilitychange', visibility);\n\n\t\t\tif (es) {\n\t\t\t\tes.removeEventListener('open', stream);\n\t\t\t\tes.removeEventListener('error', stream);\n\n\t\t\t\tif (sse.event) {\n\t\t\t\t\tes.removeEventListener(sse.event, stream);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclearInterval(interval);\n\t\t};\n\t});\n}\n"],"names":["hasWindow","window","hasNavigator","navigator","hasDocument","document","hasEventSource","EventSource","hasAbortController","AbortController","statusable","ping","sse","value","online","onLine","hidden","heartbeat","stream","url","method","cache","credentials","referrerPolicy","withCredentials","readable","set","es","interval","assign","key","val","visibility","e","target","readyState","OPEN","addEventListener","event","func","setInterval","setIntervalImmediately","abort","payload","retry","options","ac","signal","setTimeout","fetch","then","res","json","type","ok","catch","removeEventListener","clearInterval"],"mappings":"wCAEA,MAAMA,EAA8B,oBAAXC,OACnBC,EAAoC,oBAAdC,UACtBC,EAAkC,oBAAbC,SACrBC,EAAwC,oBAAhBC,YACxBC,EAAgD,oBAApBC,gBAsB3B,SAASC,GAAWC,KAAEA,EAAIC,IAAEA,IAClC,IAAIC,EAAQ,CACXC,QAAQZ,GAAeC,UAAUY,OACjCC,SAAQZ,GAAcC,SAASW,OAC/BC,WAAYjB,EACZkB,QAASlB,GAoBV,MAjBoB,iBAATW,IACVA,EAAO,CACNQ,IAAKR,EACLS,OAAQ,OACRC,MAAO,WACPC,YAAa,OACbC,eAAgB,gBAIC,iBAARX,IACVA,EAAM,CACLO,IAAKP,EACLY,iBAAiB,IAIZC,EAASZ,GAAQa,IACvB,IAAK1B,IAAcE,IAAiBE,EAAa,OAEjD,IAAIuB,EACAC,EAEJ,SAASC,EAAOC,EAAKC,GAChBlB,EAAMiB,KAASC,GACnBL,EAAKb,EAAQ,IAAKA,EAAOiB,CAACA,GAAMC,IAGjC,SAASjB,IACRe,EAAO,SAAU1B,UAAUY,QAG5B,SAASiB,IACRH,EAAO,SAAUxB,SAASW,QAG3B,SAASE,EAAOe,GACfJ,EAAO,SAAUI,EAAEC,OAAOC,aAAe5B,YAAY6B,MA0BtD,OAvBIxB,GAAON,IACVqB,EAAK,IAAIpB,YAAYK,EAAIO,IAAK,CAAEK,gBAAiBZ,EAAIY,kBACrDG,EAAGU,iBAAiB,OAAQnB,GAC5BS,EAAGU,iBAAiB,QAASnB,GAEzBN,EAAI0B,OACPX,EAAGU,iBAAiBzB,EAAI0B,MAAOpB,GAGhCW,EAAO,SAAUF,EAAGQ,aAAe5B,YAAY6B,OAG5CzB,IACHiB,EAhFH,SAAgCW,EAAMX,GAErC,OADAW,IACOC,YAAYD,EAAMX,GA8EZa,EAAuB,MAC7BpC,SAASW,QAAWb,UAAUY,QA5EtC,UAAmBI,IAAEA,EAAGuB,MAAEA,EAAQ,EAACC,QAAEA,GAAU,EAAKC,MAAEA,KAAUC,IAG/D,GAAIH,GAASlC,EAAoB,CAChC,MAAMsC,EAAK,IAAIrC,gBACfoC,EAAQE,OAASD,EAAGC,OACpBC,YAAW,IAAMF,EAAGJ,SAASA,GAG9B,OAAOO,MAAM9B,EAAK0B,GAChBK,MAAMC,GAASR,EAAUQ,EAAIC,OAAsB,WAAbD,EAAIE,MAAqBF,EAAIG,KACnEC,OAAM,KAAM,IAkEXtC,CAAUN,GAAMuC,MAAMjC,GAAcY,EAAO,YAAaZ,OACtDN,EAAKiC,OArFU,MAwFnB3C,OAAOoC,iBAAiB,SAAUvB,GAClCb,OAAOoC,iBAAiB,UAAWvB,GACnCb,OAAOoC,iBAAiB,mBAAoBL,GAErC,KACN/B,OAAOuD,oBAAoB,SAAU1C,GACrCb,OAAOuD,oBAAoB,UAAW1C,GACtCb,OAAOuD,oBAAoB,mBAAoBxB,GAE3CL,IACHA,EAAG6B,oBAAoB,OAAQtC,GAC/BS,EAAG6B,oBAAoB,QAAStC,GAE5BN,EAAI0B,OACPX,EAAG6B,oBAAoB5C,EAAI0B,MAAOpB,IAIpCuC,cAAc7B"}