@sentool/fetch-event-source
Version:
Using the Fetch API to request an SSE endpoint.
3 lines (2 loc) • 1.56 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FetchEventSource={})}(this,(function(e){"use strict";function t(e,n,o={}){let r={};const{instance:s=t,parseJson:a=!0}=o,c=((s.buffer||"")+e).split("\n"),i=e=>n?.(e);if(s.buffer=c.pop(),0===c.length)return i(r);c.forEach((e=>{if(""===e.trim()){if(a)try{r.data=JSON.parse(r.data)}catch(e){}i(r),r={}}else{const t=e.indexOf(":"),n=e.substring(0,t).trim(),o=e.substring(t+1).trim();if(n)if("data"===n)r.data=o;else r[n]=/^\d+$/.test(o)?parseInt(o):o}}))}class n{constructor(){this.controller=new AbortController}async fetch(e,n={}){const{headers:o,signal:r=this.controller.signal,parseJson:s=!0}=n;n.headers={"Content-Type":"application/json",Accept:"text/event-stream",...o};try{const a=await fetch(e,{signal:r,...n});if(await(n.onopen?.(a)),!a.ok){const d=a.headers.get("content-type"),l=n.headers.Accept;throw String(d).startsWith(l)||console.error(`Expected content-type to be ${l}, Actual: ${d}`),new Error(`HTTP ${a.status}`)}const c=a.body.getReader(),i=new TextDecoder;async function f(){const{done:e,value:o}=await c.read();if(e)return n.done?.(a);t(i.decode(o),n.onmessage,{instance:this,parseJson:s}),await f()}await f()}catch(u){this.abort(),delete this.buffer,n.onerror?.(u)}}abort(){this.controller.abort()}}e.eventsourceParser=t,e.fetchEventSource=async function(...e){const t=new n;return await t.fetch(...e),t}}));
//# sourceMappingURL=index.min.js.map