@utsp/network-server 0.15.0-nightly.20251227200128.cdc09ed → 0.15.0-nightly.20251230160137.3077b87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var y=(r,t
|
|
1
|
+
"use strict";var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var y=(r,e,t)=>e in r?d(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var p=(r,e)=>d(r,"name",{value:e,configurable:!0});var H=(r,e)=>{for(var t in e)d(r,t,{get:e[t],enumerable:!0})},C=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of S(e))!$.call(r,i)&&i!==t&&d(r,i,{get:()=>e[i],enumerable:!(n=m(e,i))||n.enumerable});return r};var w=r=>C(d({},"__esModule",{value:!0}),r);var s=(r,e,t)=>(y(r,typeof e!="symbol"?e+"":e,t),t);var b={};H(b,{SocketIOServer:()=>c});module.exports=w(b);var u=require("socket.io"),f=require("http");var v=class v{constructor(e){s(this,"io",null);s(this,"httpServer",null);s(this,"options");s(this,"running",!1);s(this,"clients",new Map);s(this,"clientData",new Map);s(this,"connectionHandlers",[]);s(this,"disconnectionHandlers",[]);s(this,"eventHandlers",new Map);s(this,"stats",{totalConnections:0,startTime:0});s(this,"bridgeHandlers",new Map);if(!Number.isInteger(e.port)||e.port<0||e.port>65535)throw new Error(`SocketIOServer: Invalid port ${e.port} - must be an integer between 0 and 65535`);if(e.maxConnections!==void 0&&(!Number.isInteger(e.maxConnections)||e.maxConnections<=0))throw new Error(`SocketIOServer: Invalid maxConnections ${e.maxConnections} - must be a positive integer`);if(e.pingInterval!==void 0&&(!Number.isFinite(e.pingInterval)||e.pingInterval<=0))throw new Error(`SocketIOServer: Invalid pingInterval ${e.pingInterval} - must be a positive number`);if(e.pingTimeout!==void 0&&(!Number.isFinite(e.pingTimeout)||e.pingTimeout<=0))throw new Error(`SocketIOServer: Invalid pingTimeout ${e.pingTimeout} - must be a positive number`);this.options={port:e.port,host:e.host??"0.0.0.0",cors:e.cors??{origin:"*"},maxConnections:e.maxConnections??1e3,pingInterval:e.pingInterval??25e3,pingTimeout:e.pingTimeout??5e3,debug:e.debug??!1},this.log("Server initialized",{port:this.options.port,host:this.options.host,maxConnections:this.options.maxConnections})}isRunning(){return this.running}getHttpServer(){return this.httpServer}async start(){if(this.running){this.log("Server already running");return}return this.log(`Starting server on ${this.options.host}:${this.options.port}...`),new Promise((e,t)=>{try{this.httpServer=(0,f.createServer)(),this.io=new u.Server(this.httpServer,{cors:this.options.cors,pingInterval:this.options.pingInterval,pingTimeout:this.options.pingTimeout,maxHttpBufferSize:1e6}),this.io.on("connection",n=>{this.handleConnection(n)}),this.httpServer.listen(this.options.port,this.options.host,()=>{this.running=!0,this.stats.startTime=Date.now(),this.log(`Server started on ${this.options.host}:${this.options.port}`),e()}),this.httpServer.on("error",n=>{this.log(`Server error: ${n.message}`),t(n)})}catch(n){t(n)}})}async stop(){if(this.running)return this.log("Stopping server..."),new Promise(e=>{this.clients.forEach(t=>{t.disconnect(!0)}),this.clients.clear(),this.clientData.clear(),this.io&&(this.io.close(()=>{this.log("Socket.IO server closed")}),this.io=null),this.httpServer?(this.httpServer.close(()=>{this.log("HTTP server closed"),this.running=!1,e()}),this.httpServer=null):(this.running=!1,e())})}getClients(){return Array.from(this.clients.keys())}getClientInfo(e){let t=this.clients.get(e);return t?{id:e,connectedAt:t.connectedAt||Date.now(),address:t.handshake.address,data:this.clientData.get(e)||{}}:null}sendToClient(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send to client ${e}: not found`);return}i.emit(t,n)}sendToClientVolatile(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send volatile to client ${e}: not found`);return}i.compress(!1).emit(t,n)}broadcast(e,t){this.io&&(this.io.emit(e,t),this.log(`Broadcast '${e}' to all clients`))}broadcastVolatile(e,t){this.io&&(this.io.volatile.emit(e,t),this.log(`Broadcast volatile '${e}' to all clients`))}broadcastExcept(e,t,n){let i=this.clients.get(e);i&&(i.broadcast.emit(t,n),this.log(`Broadcast '${t}' except ${e}`))}sendToRoom(e,t,n){this.io&&(this.io.to(e).emit(t,n),this.log(`Sent '${t}' to room '${e}'`))}joinRoom(e,t){let n=this.clients.get(e);n&&(n.join(t),this.log(`Client ${e} joined room '${t}'`))}leaveRoom(e,t){let n=this.clients.get(e);n&&(n.leave(t),this.log(`Client ${e} left room '${t}'`))}getRoomClients(e){if(!this.io)return[];let t=this.io.sockets.adapter.rooms.get(e);return t?Array.from(t):[]}disconnectClient(e,t="Server disconnect"){let n=this.clients.get(e);n&&(n.disconnect(!0),this.log(`Disconnected client ${e}: ${t}`))}on(e,t){let n=this.eventHandlers.get(e)||[];n.push(t),this.eventHandlers.set(e,n),this.log(`Registered handler for '${e}'`)}onConnect(e){this.connectionHandlers.push(e),this.log("Registered connection handler")}onDisconnect(e){this.disconnectionHandlers.push(e),this.log("Registered disconnection handler")}off(e,t){let n=this.eventHandlers.get(e);if(!n)return;let i=n.indexOf(t);i!==-1&&(n.splice(i,1),this.log(`Removed handler for '${e}'`))}setClientData(e,t,n){let i=this.clientData.get(e)||{};i[t]=n,this.clientData.set(e,i)}getClientData(e,t){let n=this.clientData.get(e);return n?n[t]:void 0}getStats(){return{connectedClients:this.clients.size,totalConnections:this.stats.totalConnections,uptime:Date.now()-this.stats.startTime}}sendBridge(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send bridge to client ${e}: not found`);return}try{let o={channel:t,data:JSON.stringify(n)};i.emit("bridge",o),this.log(`Bridge sent to ${e} on channel '${t}'`)}catch(o){this.log(`Error sending bridge to ${e}: ${o}`)}}broadcastBridge(e,t){if(this.io)try{let n={channel:e,data:JSON.stringify(t)};this.io.emit("bridge",n),this.log(`Bridge broadcast on channel '${e}'`)}catch(n){this.log(`Error broadcasting bridge: ${n}`)}}onBridge(e,t){this.bridgeHandlers.has(e)||this.bridgeHandlers.set(e,[]),this.bridgeHandlers.get(e).push(t),this.log(`Bridge handler registered for channel '${e}'`)}offBridge(e,t){let n=this.bridgeHandlers.get(e);if(n){let i=n.indexOf(t);i!==-1&&(n.splice(i,1),this.log(`Bridge handler removed for channel '${e}'`))}}handleBridgeMessage(e,t){try{let{channel:n,data:i}=t,o=JSON.parse(i),a=this.bridgeHandlers.get(n);a&&a.length>0&&a.forEach(g=>{try{g(e,o)}catch(h){this.log(`Error in bridge handler for '${n}': ${h}`)}});let l=this.bridgeHandlers.get("*");l&&l.length>0&&l.forEach(g=>{try{g(e,{channel:n,data:o})}catch(h){this.log(`Error in wildcard bridge handler: ${h}`)}}),(!a||a.length===0)&&(!l||l.length===0)&&this.log(`No bridge handler for channel '${n}' from ${e}`)}catch(n){this.log(`Error parsing bridge message from ${e}: ${n}`)}}async destroy(){await this.stop(),this.connectionHandlers=[],this.disconnectionHandlers=[],this.eventHandlers.clear(),this.log("Server destroyed")}handleConnection(e){let t=e.id;if(this.log(`Client connected: ${t}`),this.clients.size>=this.options.maxConnections){this.log(`Max connections reached, rejecting ${t}`),e.emit("error",{code:"MAX_CONNECTIONS",message:"Server is full"}),e.disconnect(!0);return}this.clients.set(t,e),this.clientData.set(t,{}),e.connectedAt=Date.now(),this.stats.totalConnections++,this.setupClientHandlers(e),this.connectionHandlers.forEach(n=>{try{n(t)}catch(i){this.log(`Error in connection handler: ${i}`)}}),e.on("ping",()=>{e.emit("pong")})}setupClientHandlers(e){let t=e.id;e.on("disconnect",n=>{this.log(`Client disconnected: ${t} (${n})`),this.clients.delete(t),this.clientData.delete(t),this.disconnectionHandlers.forEach(i=>{try{i(t,n)}catch(o){this.log(`Error in disconnection handler: ${o}`)}})}),e.on("bridge",n=>{this.handleBridgeMessage(t,n)}),this.eventHandlers.forEach((n,i)=>{e.on(i,o=>{n.forEach(a=>{try{a(t,o)}catch(l){this.log(`Error in event handler for '${i}': ${l}`)}})})})}log(e,t){this.options.debug&&(t!==void 0?console.warn(`[SocketIOServer] ${e}`,t):console.warn(`[SocketIOServer] ${e}`))}};p(v,"SocketIOServer");var c=v;0&&(module.exports={SocketIOServer});
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { INetworkServer, NetworkServerOptions, ClientInfo, ServerEventHandler, ConnectionHandler, DisconnectionHandler } from '@utsp/types';
|
|
2
2
|
export { AnyNetworkMessage, ChatMessage, ClientInfo, ConnectionHandler, DisconnectionHandler, ErrorMessage, INetworkServer, InputMessage, JoinMessage, JoinResponseMessage, LeaveMessage, LoadMessage, MessageType, NetworkMessage, NetworkServerOptions, PingMessage, PongMessage, ServerEventHandler, UpdateMessage } from '@utsp/types';
|
|
3
|
+
import { Server } from 'http';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Socket.IO Server Implementation
|
|
@@ -118,6 +119,10 @@ declare class SocketIOServer implements INetworkServer {
|
|
|
118
119
|
* ```
|
|
119
120
|
*/
|
|
120
121
|
isRunning(): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Expose underlying HTTP server (for static hosting or custom routes)
|
|
124
|
+
*/
|
|
125
|
+
getHttpServer(): Server | null;
|
|
121
126
|
/**
|
|
122
127
|
* Start the server and begin accepting connections
|
|
123
128
|
*
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var v=Object.defineProperty;var u=(o,t
|
|
1
|
+
var v=Object.defineProperty;var u=(o,e,t)=>e in o?v(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var p=(o,e)=>v(o,"name",{value:e,configurable:!0});var r=(o,e,t)=>(u(o,typeof e!="symbol"?e+"":e,t),t);import{Server as f}from"socket.io";import{createServer as m}from"http";var h=class h{constructor(e){r(this,"io",null);r(this,"httpServer",null);r(this,"options");r(this,"running",!1);r(this,"clients",new Map);r(this,"clientData",new Map);r(this,"connectionHandlers",[]);r(this,"disconnectionHandlers",[]);r(this,"eventHandlers",new Map);r(this,"stats",{totalConnections:0,startTime:0});r(this,"bridgeHandlers",new Map);if(!Number.isInteger(e.port)||e.port<0||e.port>65535)throw new Error(`SocketIOServer: Invalid port ${e.port} - must be an integer between 0 and 65535`);if(e.maxConnections!==void 0&&(!Number.isInteger(e.maxConnections)||e.maxConnections<=0))throw new Error(`SocketIOServer: Invalid maxConnections ${e.maxConnections} - must be a positive integer`);if(e.pingInterval!==void 0&&(!Number.isFinite(e.pingInterval)||e.pingInterval<=0))throw new Error(`SocketIOServer: Invalid pingInterval ${e.pingInterval} - must be a positive number`);if(e.pingTimeout!==void 0&&(!Number.isFinite(e.pingTimeout)||e.pingTimeout<=0))throw new Error(`SocketIOServer: Invalid pingTimeout ${e.pingTimeout} - must be a positive number`);this.options={port:e.port,host:e.host??"0.0.0.0",cors:e.cors??{origin:"*"},maxConnections:e.maxConnections??1e3,pingInterval:e.pingInterval??25e3,pingTimeout:e.pingTimeout??5e3,debug:e.debug??!1},this.log("Server initialized",{port:this.options.port,host:this.options.host,maxConnections:this.options.maxConnections})}isRunning(){return this.running}getHttpServer(){return this.httpServer}async start(){if(this.running){this.log("Server already running");return}return this.log(`Starting server on ${this.options.host}:${this.options.port}...`),new Promise((e,t)=>{try{this.httpServer=m(),this.io=new f(this.httpServer,{cors:this.options.cors,pingInterval:this.options.pingInterval,pingTimeout:this.options.pingTimeout,maxHttpBufferSize:1e6}),this.io.on("connection",n=>{this.handleConnection(n)}),this.httpServer.listen(this.options.port,this.options.host,()=>{this.running=!0,this.stats.startTime=Date.now(),this.log(`Server started on ${this.options.host}:${this.options.port}`),e()}),this.httpServer.on("error",n=>{this.log(`Server error: ${n.message}`),t(n)})}catch(n){t(n)}})}async stop(){if(this.running)return this.log("Stopping server..."),new Promise(e=>{this.clients.forEach(t=>{t.disconnect(!0)}),this.clients.clear(),this.clientData.clear(),this.io&&(this.io.close(()=>{this.log("Socket.IO server closed")}),this.io=null),this.httpServer?(this.httpServer.close(()=>{this.log("HTTP server closed"),this.running=!1,e()}),this.httpServer=null):(this.running=!1,e())})}getClients(){return Array.from(this.clients.keys())}getClientInfo(e){let t=this.clients.get(e);return t?{id:e,connectedAt:t.connectedAt||Date.now(),address:t.handshake.address,data:this.clientData.get(e)||{}}:null}sendToClient(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send to client ${e}: not found`);return}i.emit(t,n)}sendToClientVolatile(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send volatile to client ${e}: not found`);return}i.compress(!1).emit(t,n)}broadcast(e,t){this.io&&(this.io.emit(e,t),this.log(`Broadcast '${e}' to all clients`))}broadcastVolatile(e,t){this.io&&(this.io.volatile.emit(e,t),this.log(`Broadcast volatile '${e}' to all clients`))}broadcastExcept(e,t,n){let i=this.clients.get(e);i&&(i.broadcast.emit(t,n),this.log(`Broadcast '${t}' except ${e}`))}sendToRoom(e,t,n){this.io&&(this.io.to(e).emit(t,n),this.log(`Sent '${t}' to room '${e}'`))}joinRoom(e,t){let n=this.clients.get(e);n&&(n.join(t),this.log(`Client ${e} joined room '${t}'`))}leaveRoom(e,t){let n=this.clients.get(e);n&&(n.leave(t),this.log(`Client ${e} left room '${t}'`))}getRoomClients(e){if(!this.io)return[];let t=this.io.sockets.adapter.rooms.get(e);return t?Array.from(t):[]}disconnectClient(e,t="Server disconnect"){let n=this.clients.get(e);n&&(n.disconnect(!0),this.log(`Disconnected client ${e}: ${t}`))}on(e,t){let n=this.eventHandlers.get(e)||[];n.push(t),this.eventHandlers.set(e,n),this.log(`Registered handler for '${e}'`)}onConnect(e){this.connectionHandlers.push(e),this.log("Registered connection handler")}onDisconnect(e){this.disconnectionHandlers.push(e),this.log("Registered disconnection handler")}off(e,t){let n=this.eventHandlers.get(e);if(!n)return;let i=n.indexOf(t);i!==-1&&(n.splice(i,1),this.log(`Removed handler for '${e}'`))}setClientData(e,t,n){let i=this.clientData.get(e)||{};i[t]=n,this.clientData.set(e,i)}getClientData(e,t){let n=this.clientData.get(e);return n?n[t]:void 0}getStats(){return{connectedClients:this.clients.size,totalConnections:this.stats.totalConnections,uptime:Date.now()-this.stats.startTime}}sendBridge(e,t,n){let i=this.clients.get(e);if(!i){this.log(`Cannot send bridge to client ${e}: not found`);return}try{let s={channel:t,data:JSON.stringify(n)};i.emit("bridge",s),this.log(`Bridge sent to ${e} on channel '${t}'`)}catch(s){this.log(`Error sending bridge to ${e}: ${s}`)}}broadcastBridge(e,t){if(this.io)try{let n={channel:e,data:JSON.stringify(t)};this.io.emit("bridge",n),this.log(`Bridge broadcast on channel '${e}'`)}catch(n){this.log(`Error broadcasting bridge: ${n}`)}}onBridge(e,t){this.bridgeHandlers.has(e)||this.bridgeHandlers.set(e,[]),this.bridgeHandlers.get(e).push(t),this.log(`Bridge handler registered for channel '${e}'`)}offBridge(e,t){let n=this.bridgeHandlers.get(e);if(n){let i=n.indexOf(t);i!==-1&&(n.splice(i,1),this.log(`Bridge handler removed for channel '${e}'`))}}handleBridgeMessage(e,t){try{let{channel:n,data:i}=t,s=JSON.parse(i),a=this.bridgeHandlers.get(n);a&&a.length>0&&a.forEach(d=>{try{d(e,s)}catch(c){this.log(`Error in bridge handler for '${n}': ${c}`)}});let l=this.bridgeHandlers.get("*");l&&l.length>0&&l.forEach(d=>{try{d(e,{channel:n,data:s})}catch(c){this.log(`Error in wildcard bridge handler: ${c}`)}}),(!a||a.length===0)&&(!l||l.length===0)&&this.log(`No bridge handler for channel '${n}' from ${e}`)}catch(n){this.log(`Error parsing bridge message from ${e}: ${n}`)}}async destroy(){await this.stop(),this.connectionHandlers=[],this.disconnectionHandlers=[],this.eventHandlers.clear(),this.log("Server destroyed")}handleConnection(e){let t=e.id;if(this.log(`Client connected: ${t}`),this.clients.size>=this.options.maxConnections){this.log(`Max connections reached, rejecting ${t}`),e.emit("error",{code:"MAX_CONNECTIONS",message:"Server is full"}),e.disconnect(!0);return}this.clients.set(t,e),this.clientData.set(t,{}),e.connectedAt=Date.now(),this.stats.totalConnections++,this.setupClientHandlers(e),this.connectionHandlers.forEach(n=>{try{n(t)}catch(i){this.log(`Error in connection handler: ${i}`)}}),e.on("ping",()=>{e.emit("pong")})}setupClientHandlers(e){let t=e.id;e.on("disconnect",n=>{this.log(`Client disconnected: ${t} (${n})`),this.clients.delete(t),this.clientData.delete(t),this.disconnectionHandlers.forEach(i=>{try{i(t,n)}catch(s){this.log(`Error in disconnection handler: ${s}`)}})}),e.on("bridge",n=>{this.handleBridgeMessage(t,n)}),this.eventHandlers.forEach((n,i)=>{e.on(i,s=>{n.forEach(a=>{try{a(t,s)}catch(l){this.log(`Error in event handler for '${i}': ${l}`)}})})})}log(e,t){this.options.debug&&(t!==void 0?console.warn(`[SocketIOServer] ${e}`,t):console.warn(`[SocketIOServer] ${e}`))}};p(h,"SocketIOServer");var g=h;export{g as SocketIOServer};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@utsp/network-server",
|
|
3
|
-
"version": "0.15.0-nightly.
|
|
3
|
+
"version": "0.15.0-nightly.20251230160137.3077b87",
|
|
4
4
|
"description": "UTSP Network Server - Server-side communication adapters",
|
|
5
5
|
"author": "THP Software",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"access": "public"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@utsp/types": "0.15.0-nightly.
|
|
52
|
+
"@utsp/types": "0.15.0-nightly.20251230160137.3077b87",
|
|
53
53
|
"socket.io": "^4.7.2"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|