@radiolise/metadata-client
Version:
Library for subscribing to metadata of ICY radio streams; powered by the Radiolise API, based on WebSockets
2 lines (1 loc) • 1.53 kB
JavaScript
var E=(e=>(e.MALFORMED_PAYLOAD="malformedPayload",e.SERVER_UNREACHABLE="serverUnreachable",e.SERVER_HTTP_ERROR="serverHttpError",e.NON_ICY_RESOURCE="nonIcyResource",e))(E||{}),w="@radiolise/metadata-client";const v=()=>{};function N(e){return typeof e=="function"}function P(e){return JSON.parse(e)}function _(e){var n;return(n=N(e)?e:e.next)==null?void 0:n.bind(e)}function A(e,n){n&&e.add(n)}function C(e,n){n&&e.delete(n)}function L(e,n){for(const i of e)i(n)}function T(e){var n,i;const{url:f,reconnect:S=!0,reconnectDelay:y=2e3}=e,u=async()=>{r=new WebSocket(f,"v1"),r.addEventListener("message",t=>{const a=P(t.data);a.action==="setTitle"?c={title:a.data.title}:a.action==="reportError"&&(c={title:"",error:a.data.type}),L(l,c)}),r.addEventListener("close",t=>{t.wasClean||(p(t.code),r&&S&&setTimeout(u,y))}),await d(),o&&b(o)},R=()=>{r==null||r.close(),r=void 0},d=()=>new Promise((t,a)=>{if(r===void 0)return a(new Error(`[${w}] already terminated`));if(r.readyState===WebSocket.OPEN)return t(r);r.addEventListener("open",()=>t(r),{once:!0})}),m=async t=>{(await d()).send(JSON.stringify(t))},b=t=>(o=t==null?void 0:t.toString(),m(o?{action:"subscribe",data:{url:o}}:{action:"unsubscribe"})),O=t=>{const a=_(t);return a?(a(c),A(l,a),{unsubscribe:()=>{C(l,a)}}):{unsubscribe:v}},s={[Symbol.observable||"@@observable"]:()=>s,trackStream:b,terminate:R,subscribe:O},l=new Set;let r,c={title:""},o;const p=(i=(n=e.onSocketError)==null?void 0:n.bind(s))!=null?i:v;return u(),s}export{E as ErrorTypes,T as createMetadataClient};