nudbclient
Version:
Universal Realtime Database for Node.js and Browser
2 lines (1 loc) • 2.08 kB
JavaScript
"use strict";class e{constructor(e,s={}){this.wsUrl=e,this.socket=null,this.listeners={},this.dataCallbacks={},this.queue=[],this.headers=s.headers||{},this.connect()}connect(){const e="undefined"!=typeof WebSocket?WebSocket:require("ws");this.socket=new e(this.wsUrl),this.socket.onopen=()=>{for(console.log("🟢 WebSocket connected");this.queue.length>0;){const e=this.queue.shift();this.socket.send(JSON.stringify(e))}Object.keys(this.listeners).forEach((e=>{this.sendMessage({type:"subscribe",path:e})}))},this.socket.onmessage=e=>{try{const s=JSON.parse(e.data);"update"===s.type&&this.listeners[s.path]&&this.listeners[s.path].forEach((e=>e(s.data))),"data"===s.type&&this.dataCallbacks[s.path]&&(this.dataCallbacks[s.path].forEach((e=>e(s.data))),delete this.dataCallbacks[s.path])}catch(e){console.error("Error parsing message:",e)}},this.socket.onclose=()=>{console.warn("🔴 WebSocket disconnected. Reconnecting..."),setTimeout((()=>this.connect()),3e3)}}_generateId(){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let s="";for(let t=0;t<17;t++)s+=e.charAt(Math.floor(62*Math.random()));return`${Date.now()}${s}`}setHeader(e,s){this.headers[e]=s}sendMessage(e){const s={...e,headers:this.headers};1===this.socket.readyState?this.socket.send(JSON.stringify(s)):this.queue.push(s)}subscribe(e){this.sendMessage({type:"subscribe",path:e})}on(e,s){this.listeners[e]||(this.listeners[e]=[],this.subscribe(e)),this.listeners[e].push(s)}get(e,s){this.dataCallbacks[e]||(this.dataCallbacks[e]=[]),this.dataCallbacks[e].push(s),this.sendMessage({type:"get",path:e})}set(e,s){this.sendMessage({type:"set",path:e,data:s})}push(e,s){const t=this._generateId();return this.set(`${e}/${t}`,s),t}update(e,s){this.sendMessage({type:"update",path:e,data:s})}delete(e){this.sendMessage({type:"delete",path:e})}off(e,s){this.listeners[e]&&(this.listeners[e]=this.listeners[e].filter((e=>e!==s)),0===this.listeners[e].length&&(delete this.listeners[e],this.sendMessage({type:"unsubscribe",path:e})))}}"undefined"!=typeof window&&(window.Nudb=e),module.exports=e;