recker 1.0.19 → 1.0.20-next.595cc59
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/cli/index.d.ts +0 -1
- package/dist/cli/index.js +495 -2
- package/dist/cli/tui/shell.js +1 -1
- package/dist/core/client.d.ts +2 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +6 -7
- package/dist/plugins/cache.js +1 -1
- package/dist/plugins/hls.d.ts +90 -17
- package/dist/plugins/hls.d.ts.map +1 -1
- package/dist/plugins/hls.js +343 -173
- package/dist/plugins/retry.js +2 -2
- package/dist/testing/index.d.ts +16 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -0
- package/dist/testing/mock-dns-server.d.ts +70 -0
- package/dist/testing/mock-dns-server.d.ts.map +1 -0
- package/dist/testing/mock-dns-server.js +269 -0
- package/dist/testing/mock-ftp-server.d.ts +90 -0
- package/dist/testing/mock-ftp-server.d.ts.map +1 -0
- package/dist/testing/mock-ftp-server.js +562 -0
- package/dist/testing/mock-hls-server.d.ts +81 -0
- package/dist/testing/mock-hls-server.d.ts.map +1 -0
- package/dist/testing/mock-hls-server.js +381 -0
- package/dist/testing/mock-http-server.d.ts +100 -0
- package/dist/testing/mock-http-server.d.ts.map +1 -0
- package/dist/testing/mock-http-server.js +298 -0
- package/dist/testing/mock-sse-server.d.ts +77 -0
- package/dist/testing/mock-sse-server.d.ts.map +1 -0
- package/dist/testing/mock-sse-server.js +291 -0
- package/dist/testing/mock-telnet-server.d.ts +60 -0
- package/dist/testing/mock-telnet-server.d.ts.map +1 -0
- package/dist/testing/mock-telnet-server.js +273 -0
- package/dist/testing/mock-websocket-server.d.ts +78 -0
- package/dist/testing/mock-websocket-server.d.ts.map +1 -0
- package/dist/testing/mock-websocket-server.js +316 -0
- package/dist/testing/mock-whois-server.d.ts +57 -0
- package/dist/testing/mock-whois-server.d.ts.map +1 -0
- package/dist/testing/mock-whois-server.js +234 -0
- package/dist/transport/undici.d.ts +1 -1
- package/dist/transport/undici.d.ts.map +1 -1
- package/dist/transport/undici.js +11 -5
- package/dist/utils/dns-toolkit.js +1 -1
- package/dist/utils/dns.js +2 -2
- package/dist/utils/optional-require.js +1 -1
- package/dist/webrtc/index.js +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import * as net from 'node:net';
|
|
3
|
+
export interface MockTelnetServerOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
echo?: boolean;
|
|
7
|
+
banner?: string;
|
|
8
|
+
prompt?: string;
|
|
9
|
+
delay?: number;
|
|
10
|
+
}
|
|
11
|
+
export type CommandHandler = string | ((args: string[], session: TelnetSession) => string | Promise<string>);
|
|
12
|
+
export interface TelnetSession {
|
|
13
|
+
id: string;
|
|
14
|
+
socket: net.Socket;
|
|
15
|
+
connectedAt: Date;
|
|
16
|
+
lastActivity: Date;
|
|
17
|
+
data: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface MockTelnetStats {
|
|
20
|
+
connectionsTotal: number;
|
|
21
|
+
connectionsActive: number;
|
|
22
|
+
commandsReceived: number;
|
|
23
|
+
commandLog: Array<{
|
|
24
|
+
command: string;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export declare class MockTelnetServer extends EventEmitter {
|
|
30
|
+
private options;
|
|
31
|
+
private server;
|
|
32
|
+
private sessions;
|
|
33
|
+
private commands;
|
|
34
|
+
private started;
|
|
35
|
+
private sessionCounter;
|
|
36
|
+
private stats;
|
|
37
|
+
constructor(options?: MockTelnetServerOptions);
|
|
38
|
+
get isRunning(): boolean;
|
|
39
|
+
get port(): number;
|
|
40
|
+
get host(): string;
|
|
41
|
+
get url(): string;
|
|
42
|
+
get activeSessions(): number;
|
|
43
|
+
get statistics(): MockTelnetStats;
|
|
44
|
+
addCommand(name: string, handler: CommandHandler): void;
|
|
45
|
+
removeCommand(name: string): void;
|
|
46
|
+
getCommand(name: string): CommandHandler | undefined;
|
|
47
|
+
clearCommands(): void;
|
|
48
|
+
private addDefaultCommands;
|
|
49
|
+
broadcast(message: string): void;
|
|
50
|
+
getSession(id: string): TelnetSession | undefined;
|
|
51
|
+
disconnectSession(id: string): boolean;
|
|
52
|
+
start(): Promise<void>;
|
|
53
|
+
stop(): Promise<void>;
|
|
54
|
+
reset(): void;
|
|
55
|
+
private handleConnection;
|
|
56
|
+
private filterTelnetCommands;
|
|
57
|
+
private handleCommand;
|
|
58
|
+
static create(options?: MockTelnetServerOptions): Promise<MockTelnetServer>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=mock-telnet-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-telnet-server.d.ts","sourceRoot":"","sources":["../../src/testing/mock-telnet-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAMhC,MAAM,WAAW,uBAAuB;IAKtC,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,IAAI,CAAC,EAAE,OAAO,CAAC;IAMf,MAAM,CAAC,EAAE,MAAM,CAAC;IAMhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAMhB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE7G,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E;AAMD,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,KAAK,CAKX;gBAEU,OAAO,GAAE,uBAA4B;IAqBjD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,UAAU,IAAI,eAAe,CAKhC;IASD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAOvD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAOpD,aAAa,IAAI,IAAI;IAKrB,OAAO,CAAC,kBAAkB;IAwD1B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAShC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAOjD,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAahC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,KAAK,IAAI,IAAI;IAeb,OAAO,CAAC,gBAAgB;IAoExB,OAAO,CAAC,oBAAoB;YAiCd,aAAa;WAiDd,MAAM,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAKtF"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import * as net from 'node:net';
|
|
3
|
+
export class MockTelnetServer extends EventEmitter {
|
|
4
|
+
options;
|
|
5
|
+
server = null;
|
|
6
|
+
sessions = new Map();
|
|
7
|
+
commands = new Map();
|
|
8
|
+
started = false;
|
|
9
|
+
sessionCounter = 0;
|
|
10
|
+
stats = {
|
|
11
|
+
connectionsTotal: 0,
|
|
12
|
+
connectionsActive: 0,
|
|
13
|
+
commandsReceived: 0,
|
|
14
|
+
commandLog: [],
|
|
15
|
+
};
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
super();
|
|
18
|
+
this.options = {
|
|
19
|
+
port: 2323,
|
|
20
|
+
host: '127.0.0.1',
|
|
21
|
+
echo: true,
|
|
22
|
+
banner: 'Welcome to Recker Mock Telnet Server\r\nType "help" for available commands.\r\n',
|
|
23
|
+
prompt: '> ',
|
|
24
|
+
delay: 0,
|
|
25
|
+
...options,
|
|
26
|
+
};
|
|
27
|
+
this.addDefaultCommands();
|
|
28
|
+
}
|
|
29
|
+
get isRunning() {
|
|
30
|
+
return this.started;
|
|
31
|
+
}
|
|
32
|
+
get port() {
|
|
33
|
+
return this.options.port;
|
|
34
|
+
}
|
|
35
|
+
get host() {
|
|
36
|
+
return this.options.host;
|
|
37
|
+
}
|
|
38
|
+
get url() {
|
|
39
|
+
return `telnet://${this.options.host}:${this.options.port}`;
|
|
40
|
+
}
|
|
41
|
+
get activeSessions() {
|
|
42
|
+
return this.sessions.size;
|
|
43
|
+
}
|
|
44
|
+
get statistics() {
|
|
45
|
+
return {
|
|
46
|
+
...this.stats,
|
|
47
|
+
connectionsActive: this.sessions.size,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
addCommand(name, handler) {
|
|
51
|
+
this.commands.set(name.toLowerCase(), handler);
|
|
52
|
+
}
|
|
53
|
+
removeCommand(name) {
|
|
54
|
+
this.commands.delete(name.toLowerCase());
|
|
55
|
+
}
|
|
56
|
+
getCommand(name) {
|
|
57
|
+
return this.commands.get(name.toLowerCase());
|
|
58
|
+
}
|
|
59
|
+
clearCommands() {
|
|
60
|
+
this.commands.clear();
|
|
61
|
+
this.addDefaultCommands();
|
|
62
|
+
}
|
|
63
|
+
addDefaultCommands() {
|
|
64
|
+
this.addCommand('help', () => {
|
|
65
|
+
const cmds = Array.from(this.commands.keys()).sort();
|
|
66
|
+
return `Available commands:\r\n${cmds.map((c) => ` ${c}`).join('\r\n')}\r\n`;
|
|
67
|
+
});
|
|
68
|
+
this.addCommand('echo', (args) => args.join(' '));
|
|
69
|
+
this.addCommand('date', () => new Date().toDateString());
|
|
70
|
+
this.addCommand('time', () => new Date().toTimeString());
|
|
71
|
+
this.addCommand('datetime', () => new Date().toISOString());
|
|
72
|
+
this.addCommand('uptime', () => `${Math.floor(process.uptime())} seconds`);
|
|
73
|
+
this.addCommand('version', () => 'Recker Mock Telnet Server v1.0.0');
|
|
74
|
+
this.addCommand('whoami', (_args, session) => `Session ID: ${session.id}`);
|
|
75
|
+
this.addCommand('sessions', () => `Active sessions: ${this.sessions.size}`);
|
|
76
|
+
this.addCommand('clear', () => '\x1b[2J\x1b[H');
|
|
77
|
+
this.addCommand('quit', (_args, session) => {
|
|
78
|
+
session.socket.end('Goodbye!\r\n');
|
|
79
|
+
return '';
|
|
80
|
+
});
|
|
81
|
+
this.addCommand('exit', (_args, session) => {
|
|
82
|
+
session.socket.end('Goodbye!\r\n');
|
|
83
|
+
return '';
|
|
84
|
+
});
|
|
85
|
+
this.addCommand('ping', () => 'pong');
|
|
86
|
+
this.addCommand('reverse', (args) => args.join(' ').split('').reverse().join(''));
|
|
87
|
+
this.addCommand('upper', (args) => args.join(' ').toUpperCase());
|
|
88
|
+
this.addCommand('lower', (args) => args.join(' ').toLowerCase());
|
|
89
|
+
this.addCommand('count', (args) => `${args.join(' ').length} characters`);
|
|
90
|
+
this.addCommand('sleep', async (args) => {
|
|
91
|
+
const ms = parseInt(args[0]) || 1000;
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(ms, 10000)));
|
|
93
|
+
return `Slept for ${ms}ms`;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
broadcast(message) {
|
|
97
|
+
for (const session of this.sessions.values()) {
|
|
98
|
+
session.socket.write(`\r\n[BROADCAST] ${message}\r\n${this.options.prompt}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getSession(id) {
|
|
102
|
+
return this.sessions.get(id);
|
|
103
|
+
}
|
|
104
|
+
disconnectSession(id) {
|
|
105
|
+
const session = this.sessions.get(id);
|
|
106
|
+
if (session) {
|
|
107
|
+
session.socket.end('Disconnected by server.\r\n');
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
async start() {
|
|
113
|
+
if (this.started) {
|
|
114
|
+
throw new Error('Server already started');
|
|
115
|
+
}
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
this.server = net.createServer((socket) => {
|
|
118
|
+
this.handleConnection(socket);
|
|
119
|
+
});
|
|
120
|
+
this.server.on('error', (err) => {
|
|
121
|
+
this.emit('error', err);
|
|
122
|
+
if (!this.started) {
|
|
123
|
+
reject(err);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
this.server.listen(this.options.port, this.options.host, () => {
|
|
127
|
+
this.started = true;
|
|
128
|
+
this.emit('start');
|
|
129
|
+
resolve();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async stop() {
|
|
134
|
+
if (!this.started || !this.server)
|
|
135
|
+
return;
|
|
136
|
+
for (const session of this.sessions.values()) {
|
|
137
|
+
session.socket.end('Server shutting down.\r\n');
|
|
138
|
+
}
|
|
139
|
+
this.sessions.clear();
|
|
140
|
+
return new Promise((resolve) => {
|
|
141
|
+
this.server.close(() => {
|
|
142
|
+
this.server = null;
|
|
143
|
+
this.started = false;
|
|
144
|
+
this.emit('stop');
|
|
145
|
+
resolve();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
reset() {
|
|
150
|
+
this.stats = {
|
|
151
|
+
connectionsTotal: 0,
|
|
152
|
+
connectionsActive: 0,
|
|
153
|
+
commandsReceived: 0,
|
|
154
|
+
commandLog: [],
|
|
155
|
+
};
|
|
156
|
+
this.clearCommands();
|
|
157
|
+
this.emit('reset');
|
|
158
|
+
}
|
|
159
|
+
handleConnection(socket) {
|
|
160
|
+
const sessionId = `session-${++this.sessionCounter}`;
|
|
161
|
+
const session = {
|
|
162
|
+
id: sessionId,
|
|
163
|
+
socket,
|
|
164
|
+
connectedAt: new Date(),
|
|
165
|
+
lastActivity: new Date(),
|
|
166
|
+
data: {},
|
|
167
|
+
};
|
|
168
|
+
this.sessions.set(sessionId, session);
|
|
169
|
+
this.stats.connectionsTotal++;
|
|
170
|
+
this.emit('connect', session);
|
|
171
|
+
socket.write(this.options.banner);
|
|
172
|
+
socket.write(this.options.prompt);
|
|
173
|
+
let inputBuffer = '';
|
|
174
|
+
socket.on('data', async (data) => {
|
|
175
|
+
session.lastActivity = new Date();
|
|
176
|
+
const filtered = this.filterTelnetCommands(data);
|
|
177
|
+
const text = filtered.toString('utf8');
|
|
178
|
+
if (this.options.echo) {
|
|
179
|
+
socket.write(text);
|
|
180
|
+
}
|
|
181
|
+
inputBuffer += text;
|
|
182
|
+
while (inputBuffer.includes('\n') || inputBuffer.includes('\r')) {
|
|
183
|
+
const lineEnd = Math.max(inputBuffer.indexOf('\n'), inputBuffer.indexOf('\r'));
|
|
184
|
+
if (lineEnd === -1)
|
|
185
|
+
break;
|
|
186
|
+
let line = inputBuffer.substring(0, lineEnd).trim();
|
|
187
|
+
inputBuffer = inputBuffer.substring(lineEnd + 1).replace(/^[\r\n]+/, '');
|
|
188
|
+
if (!line) {
|
|
189
|
+
socket.write(this.options.prompt);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
await this.handleCommand(line, session);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
socket.on('close', () => {
|
|
196
|
+
this.sessions.delete(sessionId);
|
|
197
|
+
this.emit('disconnect', session);
|
|
198
|
+
});
|
|
199
|
+
socket.on('error', (err) => {
|
|
200
|
+
this.emit('error', err, session);
|
|
201
|
+
this.sessions.delete(sessionId);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
filterTelnetCommands(data) {
|
|
205
|
+
const filtered = [];
|
|
206
|
+
let i = 0;
|
|
207
|
+
while (i < data.length) {
|
|
208
|
+
if (data[i] === 255) {
|
|
209
|
+
if (i + 1 < data.length) {
|
|
210
|
+
const cmd = data[i + 1];
|
|
211
|
+
if (cmd >= 251 && cmd <= 254) {
|
|
212
|
+
i += 3;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
else if (cmd === 255) {
|
|
216
|
+
filtered.push(255);
|
|
217
|
+
i += 2;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
i += 2;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
filtered.push(data[i]);
|
|
227
|
+
i++;
|
|
228
|
+
}
|
|
229
|
+
return Buffer.from(filtered);
|
|
230
|
+
}
|
|
231
|
+
async handleCommand(input, session) {
|
|
232
|
+
this.stats.commandsReceived++;
|
|
233
|
+
this.stats.commandLog.push({
|
|
234
|
+
command: input,
|
|
235
|
+
sessionId: session.id,
|
|
236
|
+
timestamp: Date.now(),
|
|
237
|
+
});
|
|
238
|
+
this.emit('command', input, session);
|
|
239
|
+
if (this.options.delay > 0) {
|
|
240
|
+
await new Promise((resolve) => setTimeout(resolve, this.options.delay));
|
|
241
|
+
}
|
|
242
|
+
const parts = input.trim().split(/\s+/);
|
|
243
|
+
const cmdName = parts[0].toLowerCase();
|
|
244
|
+
const args = parts.slice(1);
|
|
245
|
+
const handler = this.commands.get(cmdName);
|
|
246
|
+
let response;
|
|
247
|
+
if (!handler) {
|
|
248
|
+
response = `Unknown command: ${cmdName}\r\nType "help" for available commands.`;
|
|
249
|
+
}
|
|
250
|
+
else if (typeof handler === 'string') {
|
|
251
|
+
response = handler;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
try {
|
|
255
|
+
response = await handler(args, session);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
response = `Error: ${err instanceof Error ? err.message : 'Unknown error'}`;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (response) {
|
|
262
|
+
session.socket.write(`${response}\r\n`);
|
|
263
|
+
}
|
|
264
|
+
if (!session.socket.destroyed) {
|
|
265
|
+
session.socket.write(this.options.prompt);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
static async create(options = {}) {
|
|
269
|
+
const server = new MockTelnetServer(options);
|
|
270
|
+
await server.start();
|
|
271
|
+
return server;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { WebSocket, type RawData } from 'ws';
|
|
3
|
+
export interface MockWebSocketServerOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
echo?: boolean;
|
|
8
|
+
delay?: number;
|
|
9
|
+
protocols?: string[];
|
|
10
|
+
autoCloseAfter?: number;
|
|
11
|
+
dropRate?: number;
|
|
12
|
+
maxConnections?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface MockWebSocketClient {
|
|
15
|
+
id: string;
|
|
16
|
+
socket: WebSocket;
|
|
17
|
+
connectedAt: number;
|
|
18
|
+
messageCount: number;
|
|
19
|
+
lastMessage?: RawData;
|
|
20
|
+
metadata: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
export interface MockWebSocketMessage {
|
|
23
|
+
clientId: string;
|
|
24
|
+
data: RawData;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
isBinary: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface MockWebSocketStats {
|
|
29
|
+
totalConnections: number;
|
|
30
|
+
currentConnections: number;
|
|
31
|
+
totalMessages: number;
|
|
32
|
+
totalBytesSent: number;
|
|
33
|
+
totalBytesReceived: number;
|
|
34
|
+
messageLog: MockWebSocketMessage[];
|
|
35
|
+
}
|
|
36
|
+
export declare class MockWebSocketServer extends EventEmitter {
|
|
37
|
+
private options;
|
|
38
|
+
private httpServer;
|
|
39
|
+
private wss;
|
|
40
|
+
private clients;
|
|
41
|
+
private responses;
|
|
42
|
+
private _port;
|
|
43
|
+
private _started;
|
|
44
|
+
private clientIdCounter;
|
|
45
|
+
private stats;
|
|
46
|
+
constructor(options?: MockWebSocketServerOptions);
|
|
47
|
+
get port(): number;
|
|
48
|
+
get address(): string;
|
|
49
|
+
get url(): string;
|
|
50
|
+
get isRunning(): boolean;
|
|
51
|
+
get connectionCount(): number;
|
|
52
|
+
get statistics(): MockWebSocketStats;
|
|
53
|
+
get allClients(): MockWebSocketClient[];
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
stop(): Promise<void>;
|
|
56
|
+
reset(): void;
|
|
57
|
+
setResponse(pattern: string | RegExp, response: string | Buffer | ((msg: string, client: MockWebSocketClient) => string | Buffer | null)): void;
|
|
58
|
+
clearResponses(): void;
|
|
59
|
+
setEcho(enabled: boolean): void;
|
|
60
|
+
setDelay(delay: number): void;
|
|
61
|
+
setDropRate(rate: number): void;
|
|
62
|
+
getClient(id: string): MockWebSocketClient | undefined;
|
|
63
|
+
disconnectClient(id: string, code?: number, reason?: string): void;
|
|
64
|
+
disconnectAll(code?: number, reason?: string): void;
|
|
65
|
+
send(clientId: string, data: string | Buffer | object): boolean;
|
|
66
|
+
broadcast(data: string | Buffer | object): number;
|
|
67
|
+
sendToAll(data: string | Buffer | object): number;
|
|
68
|
+
simulateMessage(clientId: string, data: string | Buffer): void;
|
|
69
|
+
ping(clientId?: string): void;
|
|
70
|
+
waitForConnections(count: number, timeout?: number): Promise<MockWebSocketClient[]>;
|
|
71
|
+
waitForMessages(count: number, timeout?: number): Promise<MockWebSocketMessage[]>;
|
|
72
|
+
private handleConnection;
|
|
73
|
+
private handleMessage;
|
|
74
|
+
private getResponse;
|
|
75
|
+
static create(options?: MockWebSocketServerOptions): Promise<MockWebSocketServer>;
|
|
76
|
+
}
|
|
77
|
+
export declare function createMockWebSocketServer(responses?: Record<string, string>, options?: MockWebSocketServerOptions): Promise<MockWebSocketServer>;
|
|
78
|
+
//# sourceMappingURL=mock-websocket-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-websocket-server.d.ts","sourceRoot":"","sources":["../../src/testing/mock-websocket-server.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAmB,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAO9D,MAAM,WAAW,0BAA0B;IAKzC,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,IAAI,CAAC,EAAE,OAAO,CAAC;IAMf,KAAK,CAAC,EAAE,MAAM,CAAC;IAKf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAMrB,cAAc,CAAC,EAAE,MAAM,CAAC;IAMxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,oBAAoB,EAAE,CAAC;CACpC;AAMD,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,SAAS,CAAoH;IACrI,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,KAAK,CAOX;gBAEU,OAAO,GAAE,0BAA+B;IAoBpD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,UAAU,IAAI,kBAAkB,CAEnC;IAED,IAAI,UAAU,IAAI,mBAAmB,EAAE,CAEtC;IAMK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,KAAK,IAAI,IAAI;IAoBb,WAAW,CACT,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GACjG,IAAI;IAKP,cAAc,IAAI,IAAI;IAItB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAItD,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAO,EAAE,MAAM,SAA2B,GAAG,IAAI;IAOlF,aAAa,CAAC,IAAI,SAAO,EAAE,MAAM,SAA2B,GAAG,IAAI;IAUnE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAe/D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;IAUjD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;IAWjD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAW9D,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcvB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBjF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAiBrF,OAAO,CAAC,gBAAgB;YA6DV,aAAa;IA+B3B,OAAO,CAAC,WAAW;WAwBN,MAAM,CAAC,OAAO,GAAE,0BAA+B,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAK5F;AASD,wBAAsB,yBAAyB,CAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAY9B"}
|