Skip to content

Commit d83c512

Browse files
committed
feat: updates to websocket utils implementation
1 parent 6d14269 commit d83c512

File tree

4 files changed

+35
-26
lines changed

4 files changed

+35
-26
lines changed

src/__tests__/client.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import type { NostrWSMessage } from '../types';
1515
describe('NostrWSClient', () => {
1616
let client: NostrWSClient;
1717
let mockLogger: ReturnType<typeof createMockLogger>;
18-
let messageHandler: ReturnType<typeof vi.fn>;
19-
let errorHandler: ReturnType<typeof vi.fn>;
18+
let messageHandler: () => Promise<void>;
19+
let errorHandler: () => void;
2020

2121
beforeEach(() => {
2222
vi.clearAllMocks();

src/client.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ export class NostrWSClient {
9393
});
9494

9595
ws.on('close', () => {
96-
if (this.options.handlers.close) {
96+
const closeHandler = this.options.handlers.close;
97+
if (closeHandler) {
9798
process.nextTick(() => {
98-
this.options.handlers.close(ws as EnhancedWebSocket);
99+
closeHandler(ws as EnhancedWebSocket);
99100
});
100101
}
101102
this.cleanup();

src/connection-manager.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { WebSocket } from 'ws';
22
import { randomBytes } from 'crypto';
33
import { Logger, EnhancedWebSocket, NostrWSMessage, ConnectionStats, NostrEvent, NostrMessageType } from './types';
44
import { createDefaultLogger } from './logger';
5-
import { NostrWSError, ErrorCodes } from './error-handler.js';
5+
import NostrWSErrorHandler from './error-handler.js';
6+
import { NostrError, NostrErrorType } from './types/errors.js';
67

78
interface ConnectionManagerOptions {
89
logger?: Logger;
@@ -73,6 +74,13 @@ export class ConnectionManager {
7374
return this.connections.get(id);
7475
}
7576

77+
/**
78+
* Get all active connections
79+
*/
80+
public getConnections(): EnhancedWebSocket[] {
81+
return Array.from(this.connections.values());
82+
}
83+
7684
/**
7785
* Ping a connection to check health
7886
*/

src/server.ts

+21-21
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,9 @@ import type { IncomingMessage } from 'http';
44
import type { NostrWSMessage, EnhancedWebSocket, NostrWSOptions } from './types/index.js';
55
import { NostrErrorType } from './types/errors.js';
66
import NostrWSErrorHandler from './error-handler.js';
7-
import ConnectionManager from './connection-manager.js';
7+
import { ConnectionManager } from './connection-manager.js';
88
import { createDefaultLogger } from './logger.js';
99

10-
/**
11-
* Default message handlers that do nothing
12-
*/
13-
const defaultHandlers: Required<NostrWSOptions['handlers']> = {
14-
message: () => Promise.resolve(),
15-
error: () => {},
16-
close: () => {},
17-
};
18-
1910
export class NostrWSServer extends EventEmitter {
2011
private readonly wss: WebSocketServer;
2112
private readonly options: Required<NostrWSOptions>;
@@ -24,13 +15,20 @@ export class NostrWSServer extends EventEmitter {
2415

2516
constructor(options: NostrWSOptions = {}) {
2617
super();
18+
19+
const defaultHandlers = {
20+
message: () => Promise.resolve(),
21+
error: () => {},
22+
close: () => {},
23+
} as const;
24+
2725
this.options = {
2826
logger: options.logger || createDefaultLogger(),
2927
heartbeatInterval: options.heartbeatInterval || 30000,
3028
handlers: {
31-
message: options.handlers?.message ?? defaultHandlers.message,
32-
error: options.handlers?.error ?? defaultHandlers.error,
33-
close: options.handlers?.close ?? defaultHandlers.close,
29+
message: options.handlers?.message || defaultHandlers.message,
30+
error: options.handlers?.error || defaultHandlers.error,
31+
close: options.handlers?.close || defaultHandlers.close,
3432
},
3533
autoReconnect: options.autoReconnect ?? true,
3634
maxReconnectAttempts: options.maxReconnectAttempts || 5,
@@ -73,25 +71,27 @@ export class NostrWSServer extends EventEmitter {
7371
});
7472
}
7573

76-
private setupWebSocket(ws: EnhancedWebSocket, request: IncomingMessage): void {
74+
private setupWebSocket(ws: EnhancedWebSocket & WebSocket, request: IncomingMessage): void {
7775
ws.on('message', async (data: Buffer) => {
7876
try {
7977
const message = JSON.parse(data.toString()) as NostrWSMessage;
8078
if (!Array.isArray(message) || message.length < 2) {
8179
throw new Error('Invalid message format');
8280
}
83-
if (this.options.handlers.message) {
84-
await this.options.handlers.message(ws, message);
81+
const messageHandler = this.options.handlers.message;
82+
if (messageHandler) {
83+
await messageHandler(ws, message);
8584
}
8685
this.emit('message', ws, message);
8786
} catch (error) {
8887
const wsError = this.errorHandler.handleMessageError(
8988
error as Error,
9089
data.toString(),
91-
ws.id
90+
(ws as EnhancedWebSocket).id
9291
);
93-
if (this.options.handlers.error) {
94-
this.options.handlers.error(ws, wsError);
92+
const errorHandler = this.options.handlers.error;
93+
if (errorHandler) {
94+
errorHandler(ws, wsError);
9595
}
9696
this.emit('error', ws, wsError);
9797
}
@@ -119,7 +119,7 @@ export class NostrWSServer extends EventEmitter {
119119

120120
public broadcast(message: NostrWSMessage): void {
121121
const connections = this.connectionManager.getConnections();
122-
connections.forEach((ws) => {
122+
connections.forEach((ws: EnhancedWebSocket & WebSocket) => {
123123
try {
124124
if (ws.readyState === WebSocket.OPEN) {
125125
ws.send(JSON.stringify(message));
@@ -137,7 +137,7 @@ export class NostrWSServer extends EventEmitter {
137137
public close(): Promise<void> {
138138
return new Promise((resolve) => {
139139
const connections = this.connectionManager.getConnections();
140-
connections.forEach((ws) => {
140+
connections.forEach((ws: EnhancedWebSocket & WebSocket) => {
141141
try {
142142
ws.close();
143143
} catch (error) {

0 commit comments

Comments
 (0)