@ananay-nag/universal-client
Version:
Universal multi-server-type client for gRPC, HTTP(S), and Socket.IO services with security middleware support.
2 lines (1 loc) • 2.28 kB
JavaScript
import*as l from"@grpc/grpc-js";import*as f from"@grpc/proto-loader";var g={};function u(i,t,s,o){let e=`${i}:${o}:${s}`;if(!g[e]){let n=f.loadSync(i,{keepCase:!0,longs:String,enums:String,defaults:!0,oneofs:!0}),c=l.loadPackageDefinition(n),r=t.split(".").reduce((p,d)=>p[d],c)[s],a=new r(o,l.credentials.createInsecure());g[e]={client:a,packageDef:c}}return g[e].client}function h(i,t,s,o,e){return new Promise((n,c)=>{let r=[s];if(e&&r.push(e),o){let a=Date.now()+o;r.push({deadline:a})}r.push((a,p)=>{if(a)return c(a);n(p)}),i[t](...r)})}import k from"axios";async function y(i,t,s,o,e={}){return(await k({url:i,method:t.toLowerCase(),data:s,timeout:o!=null?o:1e4,headers:e})).data}import{io as x}from"socket.io-client";var m={};function w(i,t){return m[i]||(m[i]=x(i,{autoConnect:!0,reconnection:!0,transports:["websocket","polling"],auth:t})),m[i]}function C(i,t,s,o=1e4){return new Promise((e,n)=>{let c;i.emit(t,s,r=>{if(clearTimeout(c),r&&r.error)return n(new Error(r.error));e(r)}),c=setTimeout(()=>n(new Error("Socket timeout")),o)})}var v=class{constructor(t){this.config=t;this.middlewares=[]}use(t){this.middlewares.push(t)}async runMiddlewares(t){for(let s of this.middlewares)await s(t)}async call(t,s,o={}){var c;let e=this.config.endpoints[t];if(!e)throw new Error(`No configuration found for endpoint key: "${t}"`);let n={endpointKey:t,serverType:e.serverType,endpoint:e,payload:s};switch(await this.runMiddlewares(n),e.serverType){case"http":{let r=e.path?`${e.host.replace(/\/$/,"")}${e.path}`:e.host,a=e.methodName||"POST",p=((c=n.httpOptions)==null?void 0:c.headers)||{};return y(r,a,n.payload,o.timeoutMs,p)}case"grpc":{let r=e.port?`${e.host}:${e.port}`:e.host,a=(e.serviceName||"").split(".");if(a.length<2)throw new Error('Invalid gRPC serviceName config. Expected "package.Service"');let[p,d]=[a[0],a[1]];if(!e.protoFile)throw new Error("gRPC endpoint missing protoFile");let S=u(e.protoFile,p,d,r);return h(S,e.methodName,n.payload,o.timeoutMs,n.grpcMetadata)}case"socket":{let r=e.port?`${e.host}:${e.port}`:e.host,a=w(r,n.socketAuth);return C(a,e.event,n.payload,o.timeoutMs)}default:throw new Error(`Unsupported protocol: ${e.serverType}`)}}};export{v as UniversalClient,h as callGrpc,y as callHttp,C as callSocket,u as getGrpcClient,w as getSocket};