siegel
Version:
Web application development ecosystem
1 lines • 2.38 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:N}}=e,{messageHandlers:f,pendingDataToSend:O,reconnecting:E}=l;function h(){i&&(clearTimeout(t),t=setTimeout(()=>{S.close(),g()},i))}let S=new WebSocket(n);return S.onopen=e=>{s.delete(n),E&&p(e),h(),c&&m.postMessage({id:N,ms:c.interval}),O.length&&(O.forEach(e=>{S.send(e)}),O.length=0),o?.onopen?.(e)},S.onmessage=e=>{h();let t=d(e),n=t[r],s=t[a];f[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:N=a,url:f=location.hostname,messageTypeKey:O="type",payloadKey:E="data"}=e,h={messageHandlers:{},pendingDataToSend:[],reconnecting:!1},{messageHandlers:S,pendingDataToSend:C}=h,T=`${c?"wss":"ws"}://${f}`;i&&(T+=`:${i}`),s&&(T+=`/${s}`);let _=`${T}_${t()}`,$=`socket_ping_${_}`,k=`socket_reconnect_${_}`;n.addEventListener("message",function({data:e}){e==$?I.send(p.payload):e==k&&(I=l(w)||I)});let w={connectURL:T,events:d,messageTypeKey:O,payloadKey:E,state:h,serverTimeout:u,ping:p,parseIncommingMsg:m,intervalWorkerData:{worker:n,pingMessageId:$},onError(e){g&&(h.reconnecting=!0,n.postMessage({id:k,ms:g}),n.postMessage({id:$})),d?.onerror?.(e)},onClose(){n.postMessage({id:$})},onReconnect(e){h.reconnecting=!1,n.postMessage({id:k}),d?.onreconnect?.(e)}},I=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}=I;if(n!=o.CLOSING&&n!=o.CLOSED){let s=N({messageTypeKey:O,messageType:e,payloadKey:E,payload:t});n==o.OPEN?I.send(s):C.push(s)}return this},close(){let{readyState:e}=I;return(e==o.CONNECTING||e==o.OPEN)&&I.close(),this},getUnderlyingSocket:()=>I}};export{o as SOCKET_CONNECTION_STATE};