stelar-time-real 2.0.4 → 3.2.1

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/src/index.d.ts CHANGED
@@ -1,25 +1,170 @@
1
- import { IncomingMessage, Server } from 'http';
2
- import { WebSocket } from 'ws';
1
+ /**
2
+ * @stelar-time-real Server
3
+ *
4
+ * Dual-protocol real-time server: WebSocket (RFC 6455) + custom binary TCP.
5
+ * Zero external dependencies — uses only Node.js built-in modules.
6
+ */
7
+ import { IncomingMessage, Server as HttpServer, ServerResponse } from 'http';
8
+ import { Socket as NetSocket } from 'net';
9
+ import type { TlsOptions } from 'tls';
10
+ import { Logger, type LogLevel } from './logger.js';
11
+ export interface IRateLimiter {
12
+ /** Returns true if the action is allowed */
13
+ check(id: string, cost?: number): boolean;
14
+ /** Reset rate limit for a specific client */
15
+ reset(id: string): void;
16
+ /** Clean up expired entries */
17
+ cleanup(): void;
18
+ /** Number of tracked entries */
19
+ size(): number;
20
+ }
21
+ export interface IIPTracker {
22
+ /** Returns true if connection from this IP is allowed */
23
+ check(ip: string): boolean;
24
+ /** Register a new connection from this IP */
25
+ add(ip: string): void;
26
+ /** Unregister a connection from this IP */
27
+ remove(ip: string): void;
28
+ /** Get current connection count for this IP */
29
+ getCount(ip: string): number;
30
+ /** Clean up stale entries */
31
+ cleanup(): void;
32
+ }
33
+ export interface StelarHooks {
34
+ /** Called when a client exceeds rate limit. Return false to skip disconnect. */
35
+ onRateLimitExceeded?: (info: {
36
+ clientId: string;
37
+ event?: string;
38
+ protocol: 'ws' | 'tcp';
39
+ }) => boolean | void;
40
+ /** Called when max connections is reached. */
41
+ onMaxConnectionsReached?: (info: {
42
+ activeConnections: number;
43
+ max: number;
44
+ ip: string;
45
+ }) => void;
46
+ /** Called when global max rooms is reached. Return false to reject room creation. */
47
+ onMaxRoomsReached?: (info: {
48
+ clientId: string;
49
+ room: string;
50
+ totalRooms: number;
51
+ max: number;
52
+ }) => boolean | void;
53
+ /** Called when per-client max rooms is reached. Return false to reject join. */
54
+ onMaxRoomsPerClientReached?: (info: {
55
+ clientId: string;
56
+ room: string;
57
+ currentRooms: number;
58
+ max: number;
59
+ }) => boolean | void;
60
+ /** Called when a payload exceeds maxPayloadSize. */
61
+ onPayloadTooLarge?: (info: {
62
+ clientId: string;
63
+ event?: string;
64
+ size: number;
65
+ max: number;
66
+ }) => void;
67
+ /** Called when a client sends an invalid message. */
68
+ onInvalidMessage?: (info: {
69
+ clientId: string;
70
+ reason: string;
71
+ protocol: 'ws' | 'tcp';
72
+ }) => void;
73
+ /** Called before a client joins a room. Return false to reject. */
74
+ onClientJoinRoom?: (info: {
75
+ clientId: string;
76
+ room: string;
77
+ metadata: Map<string, unknown>;
78
+ }) => boolean | void;
79
+ /** Called before a client leaves a room. Return false to reject. */
80
+ onClientLeaveRoom?: (info: {
81
+ clientId: string;
82
+ room: string;
83
+ }) => boolean | void;
84
+ /** Called before a broadcast. Return false to cancel. */
85
+ onBeforeBroadcast?: (info: {
86
+ event: string;
87
+ data: unknown;
88
+ excludeId?: string;
89
+ }) => boolean | void;
90
+ /** Called when a new client connects. */
91
+ onClientConnect?: (info: {
92
+ clientId: string;
93
+ ip: string;
94
+ protocol: 'ws' | 'tcp';
95
+ metadata: Map<string, unknown>;
96
+ }) => void;
97
+ /** Called when a client disconnects. */
98
+ onClientDisconnect?: (info: {
99
+ clientId: string;
100
+ ip: string;
101
+ protocol: 'ws' | 'tcp';
102
+ rooms: Set<string>;
103
+ }) => void;
104
+ }
105
+ export type EventRateLimits = Record<string, {
106
+ maxPoints: number;
107
+ windowMs: number;
108
+ }>;
3
109
  export interface StelarOptions {
4
110
  port?: number;
5
- server?: Server;
111
+ server?: HttpServer;
6
112
  namespace?: string;
7
113
  heartbeatInterval?: number;
114
+ heartbeatTimeout?: number;
115
+ tcpPort?: number | false;
116
+ maxConnections?: number;
117
+ maxConnectionsPerIP?: number;
118
+ maxRooms?: number;
119
+ maxRoomsPerClient?: number;
120
+ maxEventNameLength?: number;
121
+ maxPayloadSize?: number;
122
+ maxFrameSize?: number;
123
+ rateLimit?: {
124
+ maxPoints?: number;
125
+ windowMs?: number;
126
+ } | false;
127
+ connectTimeout?: number;
128
+ gracefulShutdown?: boolean;
129
+ shutdownTimeout?: number;
130
+ healthEndpoint?: string | false;
131
+ logger?: Logger | LogLevel | false;
132
+ tls?: TlsOptions;
133
+ allowedOrigins?: string[];
134
+ /** Custom rate limiter implementation. Replaces the built-in token bucket. */
135
+ customRateLimiter?: IRateLimiter;
136
+ /** Custom IP connection tracker. Replaces the built-in per-IP counter. */
137
+ customIPTracker?: IIPTracker;
138
+ /** Custom function to generate client IDs. Defaults to UUID v4. */
139
+ generateClientId?: () => string;
140
+ /** Per-event rate limits. Each event can have different maxPoints and windowMs. */
141
+ eventRateLimits?: EventRateLimits;
142
+ /** Hook callbacks for server events. */
143
+ hooks?: StelarHooks;
144
+ /** Custom health check handler. Receives (req, res, stats). */
145
+ customHealthHandler?: (req: IncomingMessage, res: ServerResponse, stats: StelarStats) => void;
8
146
  }
9
147
  export interface StelarClientInfo {
10
148
  id: string;
11
- room: string | null;
149
+ rooms: Set<string>;
12
150
  lastPing: number;
151
+ protocol: 'ws' | 'tcp';
152
+ connectedAt: number;
153
+ metadata: Map<string, unknown>;
154
+ messagesReceived: number;
155
+ messagesSent: number;
156
+ remoteAddress: string;
13
157
  }
14
158
  export interface StelarContext {
15
159
  id: string;
16
- socket: WebSocket;
17
- req: IncomingMessage;
160
+ socket: NetSocket;
161
+ req: IncomingMessage | null;
18
162
  data?: unknown;
19
163
  buffer?: Uint8Array;
20
164
  isBinary?: boolean;
21
165
  event?: string;
22
166
  error?: Error;
167
+ clientInfo: StelarClientInfo;
23
168
  emit: (event: string, data: unknown) => void;
24
169
  send: (respId: string, data: unknown) => void;
25
170
  emitBinary: (event: string, buffer: ArrayBuffer) => void;
@@ -29,10 +174,12 @@ export interface StelarContext {
29
174
  toId: (id: string, event: string, data: unknown) => void;
30
175
  getClients: (room?: string) => {
31
176
  id: string;
32
- room: string | null;
177
+ rooms: string[];
33
178
  }[];
34
179
  joinRoom: (room: string) => void;
35
- leaveRoom: () => void;
180
+ leaveRoom: (room: string) => void;
181
+ setMetadata: (key: string, value: unknown) => void;
182
+ getMetadata: (key: string) => unknown;
36
183
  ack: (ackName: string, data: unknown) => void;
37
184
  }
38
185
  export interface StelarMiddleware {
@@ -43,43 +190,162 @@ export type StelarWildcardHandler = (data: {
43
190
  event: string;
44
191
  data: StelarContext;
45
192
  }) => void;
193
+ export interface StelarStats {
194
+ totalConnections: number;
195
+ activeConnections: number;
196
+ totalMessagesReceived: number;
197
+ totalMessagesSent: number;
198
+ totalRooms: number;
199
+ uptime: number;
200
+ wsConnections: number;
201
+ tcpConnections: number;
202
+ memoryUsage: NodeJS.MemoryUsage;
203
+ rateLimiterEntries: number;
204
+ }
46
205
  declare class StelarServer {
47
206
  private port;
48
- private server;
207
+ private httpServer;
208
+ private tcpServer;
49
209
  private namespace;
50
- private wss;
210
+ private heartbeatInterval;
211
+ private heartbeatTimeout;
212
+ private tcpPort;
213
+ private maxConnections;
214
+ private maxRooms;
215
+ private maxRoomsPerClient;
216
+ private maxPayloadSize;
217
+ private maxFrameSize;
218
+ private maxWSFrameSize;
219
+ private connectTimeout;
220
+ private doGracefulShutdown;
221
+ private shutdownTimeout;
222
+ private healthEndpoint;
223
+ private tlsOptions;
224
+ private allowedOrigins;
225
+ private _customRateLimiter;
226
+ private _customIPTracker;
227
+ private _generateClientId;
228
+ private _customHealthHandler;
229
+ private hooks;
230
+ private eventRateLimiters;
231
+ private _clientRateOverrides;
51
232
  private clients;
233
+ private clientsById;
234
+ private rooms;
52
235
  private events;
53
236
  private middlewares;
54
- private heartbeatInterval;
55
237
  private _hbTimer;
238
+ private _rateCleanupTimer;
56
239
  private _wildcardHandler;
57
240
  private _connectionHandler;
58
241
  private _acks;
59
242
  private _externalServers;
243
+ private _upgradeHandler;
244
+ private _requestHandler;
245
+ private _started;
246
+ private _startTime;
247
+ private _shuttingDown;
248
+ private _sigintHandler;
249
+ private _sigtermHandler;
250
+ private rateLimiter;
251
+ private ipTracker;
252
+ private _totalConnections;
253
+ private _totalMessagesReceived;
254
+ private _totalMessagesSent;
255
+ private log;
60
256
  constructor(options?: StelarOptions);
61
257
  static of(path: string, options?: StelarOptions): StelarServer;
258
+ /** Update server configuration at runtime. */
259
+ updateConfig(options: Partial<StelarOptions>): this;
260
+ /** Set a per-client rate limit override. */
261
+ setClientRateLimit(clientId: string, config: {
262
+ maxPoints: number;
263
+ windowMs: number;
264
+ }): this;
265
+ /** Remove a per-client rate limit override, falling back to the global limiter. */
266
+ removeClientRateLimit(clientId: string): this;
267
+ /** Set a per-event rate limit. */
268
+ setEventRateLimit(event: string, config: {
269
+ maxPoints: number;
270
+ windowMs: number;
271
+ }): this;
272
+ /** Remove a per-event rate limit. */
273
+ removeEventRateLimit(event: string): this;
274
+ /** Get the current server configuration as a read-only object. */
275
+ getConfig(): Readonly<{
276
+ maxConnections: number;
277
+ maxConnectionsPerIP: number;
278
+ maxRooms: number;
279
+ maxRoomsPerClient: number;
280
+ maxPayloadSize: number;
281
+ heartbeatInterval: number;
282
+ heartbeatTimeout: number;
283
+ connectTimeout: number;
284
+ shutdownTimeout: number;
285
+ hasCustomRateLimiter: boolean;
286
+ hasCustomIPTracker: boolean;
287
+ hasCustomClientIdGenerator: boolean;
288
+ hasCustomHealthHandler: boolean;
289
+ eventRateLimits: string[];
290
+ hooks: string[];
291
+ allowedOrigins: string[] | null;
292
+ }>;
62
293
  use(middleware: StelarMiddleware): this;
63
294
  on(event: string, handler: StelarEventHandler): this;
64
295
  onAll(handler: StelarWildcardHandler): this;
65
296
  onConnection(handler: StelarEventHandler): this;
297
+ onDisconnect(handler: StelarEventHandler): this;
66
298
  onAck(name: string, handler: StelarEventHandler): this;
67
- broadcast(event: string, data: unknown): this;
299
+ broadcast(event: string, data: unknown, excludeId?: string): this;
68
300
  broadcastBinary(event: string, buffer: ArrayBuffer): void;
69
- to(room: string, event: string, data: unknown): this;
301
+ to(room: string, event: string, data: unknown, excludeId?: string): this;
70
302
  toId(id: string, event: string, data: unknown): this;
71
303
  getClients(room?: string): {
72
304
  id: string;
73
- room: string | null;
305
+ rooms: string[];
74
306
  }[];
307
+ getRoomMembers(room: string): string[];
308
+ getRooms(): string[];
75
309
  getPort(): number;
310
+ getStats(): StelarStats;
311
+ private _getRateLimiterSize;
312
+ /** Check rate limit. Priority: per-client override > event-specific > custom/global. */
313
+ private _checkRateLimit;
314
+ private _sendJsonToClient;
315
+ private _sendBinaryRaw;
316
+ private _joinRoom;
317
+ private _leaveRoom;
318
+ private _removeFromAllRooms;
319
+ private _buildCtx;
76
320
  private runMiddlewares;
77
321
  private startHeartbeat;
78
- private handleConnection;
322
+ private _getClientIP;
323
+ private _registerClient;
324
+ private _unregisterClient;
325
+ private _checkOrigin;
326
+ private handleWSUpgrade;
327
+ private _processWSData;
328
+ private _handleWSFrame;
329
+ private handleTCPConnection;
330
+ private _processTCPData;
331
+ private _handleTCPFrame;
332
+ private _handleError;
333
+ private _handleHealthCheck;
334
+ private _shutdownCallbacks;
335
+ /** Register a callback for when graceful shutdown completes. */
336
+ onShutdown(callback: (signal: string, force: boolean) => void): this;
337
+ private _emitShutdown;
338
+ private _setupGracefulShutdown;
339
+ private _removeSignalHandlers;
79
340
  start(callback?: (port: number) => void): Promise<number>;
341
+ private _startTCPServer;
342
+ private _startPlainTCPServer;
80
343
  stop(): this;
81
344
  }
82
345
  export default StelarServer;
83
346
  export { StelarServer };
84
347
  export { default as StelarClient } from './client.js';
348
+ export { Logger, NULL_LOGGER, type LogLevel } from './logger.js';
349
+ export { ProtocolError, validateEventName, DEFAULT_MAX_FRAME_SIZE, MAX_EVENT_LENGTH, HEADER_SIZE } from './protocol.js';
350
+ export { WebSocketError, DEFAULT_MAX_WS_FRAME_SIZE, CLOSE_NORMAL, CLOSE_GOING_AWAY, CLOSE_PROTOCOL_ERROR, CLOSE_POLICY_VIOLATION, CLOSE_MESSAGE_TOO_BIG, CLOSE_INVALID_PAYLOAD, CLOSE_UNSUPPORTED } from './websocket.js';
85
351
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}