siegel
Version:
Web application development ecosystem
1 lines • 2.37 kB
JavaScript
import e from"../../intervals__worker.js";import t from"../../../common/get_uniq_id/index.js";let n=e(),o={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3},s=new Set,r=({data:e})=>JSON.parse(e),a=({messageTypeKey:e,messageType:t,payloadKey:n,payload:o})=>JSON.stringify({[e]:t,[n]:o}),l=e=>{let t,{connectURL:n}=e;if(s.has(n))return null;s.add(n);let{events:o,messageTypeKey:r,payloadKey:a,state:l,serverTimeout:i,ping:c,parseIncommingMsg:d,onError:g,onClose:u,onReconnect:p,intervalWorkerData:{worker:m,pingMessageId:f}}=e,{messageHandlers:h,pendingDataToSend:N,reconnecting:E}=l;function O(){i&&(clearTimeout(t),t=setTimeout(()=>{S.close(),g()},i))}let S=new WebSocket(n);return S.onopen=e=>{s.delete(n),E&&p(e),O(),c&&m.postMessage({id:f,ms:c.interval}),N.length&&(N.forEach(e=>{S.send(e)}),N.length=0),o?.onopen?.(e)},S.onmessage=e=>{O();let t=d(e),n=t[r],s=t[a];h[n]?.forEach(e=>{e(s)}),o?.onmessage?.(e,t)},S.onclose=e=>{clearTimeout(t),u(),o?.onclose?.(e)},S.onerror=e=>{clearTimeout(t),s.delete(n),g(e)},S};export default function(e){let{path:s,port:i,wss:c,events:d,reconnectInterval:g,serverTimeout:u,ping:p,parseIncommingMsg:m=r,serializeOutcommingMsg:f=a,url:h=location.hostname,messageTypeKey:N="type",payloadKey:E="data"}=e,O={messageHandlers:{},pendingDataToSend:[],reconnecting:!1},{messageHandlers:S,pendingDataToSend:C}=O,T=`${c?"wss":"ws"}://${h}`;i&&(T+=`:${i}`),s&&(T+=`/${s}`);let _=`${T}_${t()}`,$=`socket_ping_${_}`,k=`socket_reconnect_${_}`;n.addEventListener("message",function({data:e}){e==$?M.send(p.payload):e==k&&(M=l(w)||M)});let w={connectURL:T,events:d,messageTypeKey:N,payloadKey:E,state:O,serverTimeout:u,ping:p,parseIncommingMsg:m,intervalWorkerData:{worker:n,pingMessageId:$},onError(e){g&&(O.reconnecting=!0,n.postMessage({id:k,ms:g}),n.postMessage({id:$})),d?.onerror?.(e)},onClose(){n.postMessage({id:$})},onReconnect(e){O.reconnecting=!1,n.postMessage({id:k}),d?.onreconnect?.(e)}},M=l(w);return{on(e,t){let n=S[e];return n?n.has(t)||n.add(t):S[e]=new Set([t]),this},off(e,t){return S[e]?.delete(t),this},allOff(e){return delete S[e],this},send(e,t){let{readyState:n}=M;if(n!=o.CLOSING&&n!=o.CLOSED){let s=f({messageTypeKey:N,messageType:e,payloadKey:E,payload:t});n==o.OPEN?M.send(s):C.push(s)}return this},close(){let{readyState:e}=M;return(e==o.CONNECTING||e==o.OPEN)&&M.close(),this},getUnderlyingSocket:()=>M}}export{o as STATE};