@rtco/server
Version:
Artico signaling server
2 lines (1 loc) • 1.63 kB
JavaScript
import{Server as F}from"socket.io";class E{#j=0;#z;constructor(j="[artico]",B=1){this.#z=j,this.#j=B}get logLevel(){return this.#j}set logLevel(j){this.#j=j}debug(...j){if(this.#j>=4)this.#q(4,...j)}log(...j){if(this.#j>=3)this.#q(4,...j)}warn(...j){if(this.#j>=2)this.#q(2,...j)}error(...j){if(this.#j>=1)this.#q(1,...j)}#q(j,...B){let q=[this.#z,...B];if(q.forEach((z,A)=>{if(z instanceof Error)q[A]=`(${z.name}) ${z.message}`}),j>=4)console.debug(...q);else if(j>=3)console.log(...q);else if(j>=2)console.warn("WARNING",...q);else if(j>=1)console.error("ERROR",...q)}}class G{#j;#z;#q;#A=new Map;#B=new Map;constructor(j){this.#j=new E("[artico]",j?.debug??1),this.#j.debug("new ArticoServer:",j);let B=j?.ioOptions??{transports:["websocket"],cors:{origin:"*"}};if(j?.httpServer)this.#z=j.httpServer,this.#q=new F(j.httpServer,B);else this.#q=new F(B);this.#q.on("connection",(q)=>{let{id:z}=q.handshake.query;if(this.#j.log("connection:",z),!z||typeof z!=="string"){q.emit("error","invalid-id"),q.disconnect(!0);return}if(this.#A.has(z)){q.emit("error","id-taken"),q.disconnect(!0);return}q.emit("open",z),this.#A.set(z,q),q.on("disconnect",()=>{this.#j.log("disconnected:",z),this.#A.delete(z)}),q.on("signal",(A)=>{this.#j.debug("signal:",A);let C={...A,source:z};this.#A.get(A.target)?.emit("signal",C)}),q.on("join",async(A,C)=>{if(this.#j.debug(`peer ${z} joins room ${A}`),await q.join(A),q.broadcast.to(A).emit("join",A,z,C),!this.#B.has(A))this.#B.set(A,new Set);this.#B.get(A)?.add(z)})})}get server(){return this.#q}listen=(j)=>{if(this.#z)this.#z.listen(j);else this.server.listen(j)}}export{G as ArticoServer};