UNPKG

svelte-streamable

Version:

Super tiny, simple to use SvelteJS store for real-time updates from server via SSE.

1 lines 3.42 kB
{"version":3,"file":"index.min.mjs","sources":["../src/index.js"],"sourcesContent":["import { readable } from 'svelte/store';\n\nconst esx = {};\n\nexport function streamable(\n\t{ url, event = 'message', format = 'json', ...options },\n\tcallback,\n\tdefaultValue\n) {\n\tconst auto = !callback || callback.length < 2;\n\tconst initial = defaultValue ? Promise.resolve(defaultValue) : new Promise(noop);\n\treturn readable(initial, (set) => {\n\t\tlet cleanup = noop;\n\n\t\tfunction resolve(value) {\n\t\t\tset(typeof value !== 'undefined' ? Promise.resolve(value) : initial);\n\t\t}\n\n\t\tfunction update(e) {\n\t\t\tcleanup(false);\n\n\t\t\tlet data;\n\n\t\t\tif (e && e.data) {\n\t\t\t\tif (format === 'json') {\n\t\t\t\t\tdata = JSON.parse(e.data);\n\t\t\t\t} else if (format === 'base64') {\n\t\t\t\t\tdata = atob(e.data);\n\t\t\t\t} else if (format === 'urlencoded') {\n\t\t\t\t\tdata = Object.fromEntries(new URLSearchParams(e.data));\n\t\t\t\t} else {\n\t\t\t\t\tdata = e.data;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = callback ? callback(data, resolve) : data;\n\n\t\t\tif (auto) {\n\t\t\t\tresolve(result);\n\t\t\t} else {\n\t\t\t\tcleanup = typeof result === 'function' ? result : noop;\n\t\t\t}\n\t\t}\n\n\t\tfunction error(e) {\n\t\t\tset(Promise.reject(e));\n\t\t}\n\n\t\tconst keypath = Object.entries(options)\n\t\t\t.sort()\n\t\t\t.reduce((k, [, v]) => `${k}/${v}`, url);\n\n\t\tlet es = esx[keypath];\n\n\t\tif (!es) {\n\t\t\tes = new EventSource(url, options);\n\t\t\tes.subscribers = 0;\n\t\t\tesx[keypath] = es;\n\t\t}\n\n\t\tes.addEventListener('error', error);\n\t\tes.addEventListener(event, update);\n\n\t\tcallback && setTimeout(update);\n\n\t\tes.subscribers++;\n\n\t\treturn () => {\n\t\t\tes.removeEventListener('error', error);\n\t\t\tes.removeEventListener(event, update);\n\n\t\t\tif (!--es.subscribers) {\n\t\t\t\tes.close();\n\t\t\t\tdelete esx[keypath];\n\t\t\t}\n\n\t\t\tcleanup(true);\n\t\t};\n\t});\n}\n\nfunction noop() {}\n"],"names":["esx","streamable","url","event","format","options","callback","defaultValue","auto","length","initial","Promise","resolve","noop","readable","set","cleanup","value","update","e","data","JSON","parse","atob","Object","fromEntries","URLSearchParams","result","error","reject","keypath","entries","sort","reduce","k","v","es","EventSource","subscribers","addEventListener","setTimeout","removeEventListener","close"],"mappings":"wCAEA,MAAMA,EAAM,GAEL,SAASC,GACfC,IAAEA,EAAGC,MAAEA,EAAQ,UAASC,OAAEA,EAAS,UAAWC,GAC9CC,EACAC,GAEA,MAAMC,GAAQF,GAAYA,EAASG,OAAS,EACtCC,EAAUH,EAAeI,QAAQC,QAAQL,GAAgB,IAAII,QAAQE,GAC3E,OAAOC,EAASJ,GAAUK,IACzB,IAAIC,EAAUH,EAEd,SAASD,EAAQK,GAChBF,OAAqB,IAAVE,EAAwBN,QAAQC,QAAQK,GAASP,GAG7D,SAASQ,EAAOC,GAGf,IAAIC,EAFJJ,GAAQ,GAIJG,GAAKA,EAAEC,OAETA,EADc,SAAXhB,EACIiB,KAAKC,MAAMH,EAAEC,MACC,WAAXhB,EACHmB,KAAKJ,EAAEC,MACO,eAAXhB,EACHoB,OAAOC,YAAY,IAAIC,gBAAgBP,EAAEC,OAEzCD,EAAEC,MAIX,MAAMO,EAASrB,EAAWA,EAASc,EAAMR,GAAWQ,EAEhDZ,EACHI,EAAQe,GAERX,EAA4B,mBAAXW,EAAwBA,EAASd,EAIpD,SAASe,EAAMT,GACdJ,EAAIJ,QAAQkB,OAAOV,IAGpB,MAAMW,EAAUN,OAAOO,QAAQ1B,GAC7B2B,OACAC,QAAO,CAACC,IAAMC,KAAO,GAAGD,KAAKC,KAAKjC,GAEpC,IAAIkC,EAAKpC,EAAI8B,GAeb,OAbKM,IACJA,EAAK,IAAIC,YAAYnC,EAAKG,GAC1B+B,EAAGE,YAAc,EACjBtC,EAAI8B,GAAWM,GAGhBA,EAAGG,iBAAiB,QAASX,GAC7BQ,EAAGG,iBAAiBpC,EAAOe,GAE3BZ,GAAYkC,WAAWtB,GAEvBkB,EAAGE,cAEI,KACNF,EAAGK,oBAAoB,QAASb,GAChCQ,EAAGK,oBAAoBtC,EAAOe,KAEvBkB,EAAGE,cACTF,EAAGM,eACI1C,EAAI8B,IAGZd,GAAQ,OAKX,SAASH"}