nudbclient
Version:
Universal Realtime Database for Node.js and Browser
2 lines (1 loc) • 2.58 kB
JavaScript
"use strict";var e=require("isomorphic-ws");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}}exports.NuDB=class extends s{constructor(e,s={}){super(e,s)}connect(){this.socket=new e(this.wsUrl),this.socket.on("open",(()=>{console.log("🟢 NuDB WebSocket connected"),this._processQueue(),this._resubscribe()})),this.socket.on("message",(e=>this._handleMessage(e))),this.socket.on("close",(()=>this._handleClose())),this.socket.on("error",(e=>{console.error("NuDB WebSocket error:",e)}))}_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})}))}};