@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.58 kB
JavaScript
var RadioliseMetadata=function(s){"use strict";var d=(e=>(e.MALFORMED_PAYLOAD="malformedPayload",e.SERVER_UNREACHABLE="serverUnreachable",e.SERVER_HTTP_ERROR="serverHttpError",e.NON_ICY_RESOURCE="nonIcyResource",e))(d||{}),y="@radiolise/metadata-client";const E=()=>{};function R(e){return typeof e=="function"}function S(e){return JSON.parse(e)}function m(e){var n;return(n=R(e)?e:e.next)==null?void 0:n.bind(e)}function O(e,n){n&&e.add(n)}function w(e,n){n&&e.delete(n)}function N(e,n){for(const i of e)i(n)}function p(e){var n,i;const{url:C,reconnect:P=!0,reconnectDelay:T=2e3}=e,b=async()=>{r=new WebSocket(C,"v1"),r.addEventListener("message",t=>{const a=S(t.data);a.action==="setTitle"?c={title:a.data.title}:a.action==="reportError"&&(c={title:"",error:a.data.type}),N(u,c)}),r.addEventListener("close",t=>{t.wasClean||(k(t.code),r&&P&&setTimeout(b,T))}),await v(),o&&f(o)},_=()=>{r==null||r.close(),r=void 0},v=()=>new Promise((t,a)=>{if(r===void 0)return a(new Error(`[${y}] already terminated`));if(r.readyState===WebSocket.OPEN)return t(r);r.addEventListener("open",()=>t(r),{once:!0})}),A=async t=>{(await v()).send(JSON.stringify(t))},f=t=>(o=t==null?void 0:t.toString(),A(o?{action:"subscribe",data:{url:o}}:{action:"unsubscribe"})),L=t=>{const a=m(t);return a?(a(c),O(u,a),{unsubscribe:()=>{w(u,a)}}):{unsubscribe:E}},l={[Symbol.observable||"@@observable"]:()=>l,trackStream:f,terminate:_,subscribe:L},u=new Set;let r,c={title:""},o;const k=(i=(n=e.onSocketError)==null?void 0:n.bind(l))!=null?i:E;return b(),l}return s.ErrorTypes=d,s.createMetadataClient=p,s}({});