socked
Version:
Lightweight WebSocket client & server wrapper with reconnects, events, acks, and dev tools.
3 lines (2 loc) • 1.42 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).LightWS={})}(this,(function(e){"use strict";e.createClient=function(e,t={}){const{reconnect:n=!0,reconnectInterval:o=2e3,maxRetries:c=10,debug:i=!1}=t;let r;const s={};let f=!1,u=0;function a(...e){i&&console.log("[WebSocketClient]",...e)}return function t(){r=new WebSocket(e),r.onopen=()=>{f=!0,u=0,a("Connected"),s.connect&&s.connect.forEach((e=>e()))},r.onmessage=e=>{const t=function(e){try{return JSON.parse(e)}catch(e){return null}}(e.data);t&&s[t.event]&&s[t.event].forEach((e=>e(t.data)))},r.onerror=e=>{s.error&&s.error.forEach((t=>t(e)))},r.onclose=()=>{f=!1,a("Disconnected"),s.disconnect&&s.disconnect.forEach((e=>e())),n&&u<c&&(u++,setTimeout((()=>t()),o*u))}}(),{emit(e,t){f&&r.send(function(e,t){return JSON.stringify({event:e,data:t})}(e,t))},emitWithAck(e,t,n=2e3){return new Promise(((o,c)=>{const i=Date.now().toString(),r=`${e}_ack_${i}`;this.on(r,(e=>{o(e),this.off(r)})),this.emit(e,{...t,_ackId:i}),setTimeout((()=>{this.off(r),c("Timeout")}),n)}))},on(e,t){s[e]||(s[e]=[]),s[e].push(t)},once(e,t){const n=o=>{t(o),this.off(e,n)};this.on(e,n)},off(e,t){s[e]&&(t?s[e]=s[e].filter((e=>e!==t)):delete s[e])},getStatus:()=>f?"connected":"disconnected"}}}));
//# sourceMappingURL=client.umd.min.js.map