UNPKG

nudbclient

Version:

Universal Realtime Database for Node.js and Browser

2 lines (1 loc) 2.99 kB
var Nudb=function(e){"use strict";class s{constructor(e,s={}){this.wsUrl=e,this.baseUrl=e.replace(/^ws/,"http"),this.options=s,this.socket=null,this.listeners={},this.dataCallbacks={},this.queue=[],this.headers=s.headers||{},this.connect()}async fn(e,s={}){return(await fetch(`${this.baseUrl}/functions/${e}`,{method:"POST",headers:{"Content-Type":"application/json",...this.headers},body:JSON.stringify(s)})).json()}async fetchData(e){return(await fetch(`${this.baseUrl}/data/${e}`,{headers:{...this.headers}})).json()}_handleMessage(e){try{const s=JSON.parse(e);"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("Message handling error:",e)}}_handleClose(){console.log("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){return this.headers[e]=s,this}sendMessage(e){const s={...e,headers:this.headers};return 1===this.socket?.readyState?this.socket.send(JSON.stringify(s)):this.queue.push(s),this}subscribe(e){return this.sendMessage({type:"subscribe",path:e}),this}on(e,s){return this.listeners[e]||(this.listeners[e]=[],this.subscribe(e)),this.listeners[e].push(s),this}get(e,s){return this.dataCallbacks[e]||(this.dataCallbacks[e]=[]),this.dataCallbacks[e].push(s),this.sendMessage({type:"get",path:e}),this}set(e,s){return this.sendMessage({type:"set",path:e,data:s}),this}push(e,s){const t=this._generateId(),a=`${e}/${t}`;return this.set(a,s),t}update(e,s){return this.sendMessage({type:"update",path:e,data:s}),this}delete(e){return this.sendMessage({type:"delete",path:e}),this}close(){return this.socket&&this.socket.close(),this}}return e.NuDB=class extends s{constructor(e,s={}){super(e,s)}connect(){this.socket=new WebSocket(this.wsUrl),this.socket.onopen=()=>{console.log("🟢 NuDB WebSocket connected"),this._processQueue(),this._resubscribe()},this.socket.onmessage=this._handleMessage.bind(this),this.socket.onclose=this._handleClose.bind(this)}_processQueue(){for(;this.queue.length>0;){const e=this.queue.shift();this.socket.send(JSON.stringify(e))}}_resubscribe(){Object.keys(this.listeners).forEach((e=>{this.sendMessage({type:"subscribe",path:e})}))}_handleMessage(e){try{const s=JSON.parse(e.data);console.log("📩 NuDB received:",s),"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("NuDB message parse error:",e)}}_handleClose(){console.warn("🔴 NuDB WebSocket disconnected. Reconnecting..."),setTimeout((()=>this.connect()),3e3)}},e}({});