recker 1.0.4 → 1.0.6
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/README.md +1 -1
- package/dist/ai/adaptive-timeout.d.ts +51 -0
- package/dist/ai/adaptive-timeout.d.ts.map +1 -0
- package/dist/ai/adaptive-timeout.js +208 -0
- package/dist/ai/client.d.ts +24 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +289 -0
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +6 -0
- package/dist/ai/providers/anthropic.d.ts +64 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +367 -0
- package/dist/ai/providers/base.d.ts +49 -0
- package/dist/ai/providers/base.d.ts.map +1 -0
- package/dist/ai/providers/base.js +145 -0
- package/dist/ai/providers/index.d.ts +7 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +3 -0
- package/dist/ai/providers/openai.d.ts +65 -0
- package/dist/ai/providers/openai.d.ts.map +1 -0
- package/dist/ai/providers/openai.js +298 -0
- package/dist/ai/rate-limiter.d.ts +44 -0
- package/dist/ai/rate-limiter.d.ts.map +1 -0
- package/dist/ai/rate-limiter.js +212 -0
- package/dist/bench/generator.d.ts +19 -0
- package/dist/bench/generator.d.ts.map +1 -0
- package/dist/bench/generator.js +86 -0
- package/dist/bench/stats.d.ts +35 -0
- package/dist/bench/stats.d.ts.map +1 -0
- package/dist/bench/stats.js +60 -0
- package/dist/cache/memory-storage.d.ts.map +1 -1
- package/dist/cache/memory-storage.js +0 -5
- package/dist/cli/handler.d.ts +11 -0
- package/dist/cli/handler.d.ts.map +1 -0
- package/dist/cli/handler.js +92 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +255 -0
- package/dist/cli/presets.d.ts +2 -0
- package/dist/cli/presets.d.ts.map +1 -0
- package/dist/cli/presets.js +67 -0
- package/dist/cli/tui/ai-chat.d.ts +3 -0
- package/dist/cli/tui/ai-chat.d.ts.map +1 -0
- package/dist/cli/tui/ai-chat.js +100 -0
- package/dist/cli/tui/load-dashboard.d.ts +3 -0
- package/dist/cli/tui/load-dashboard.d.ts.map +1 -0
- package/dist/cli/tui/load-dashboard.js +117 -0
- package/dist/cli/tui/shell.d.ts +27 -0
- package/dist/cli/tui/shell.d.ts.map +1 -0
- package/dist/cli/tui/shell.js +386 -0
- package/dist/cli/tui/websocket.d.ts +2 -0
- package/dist/cli/tui/websocket.d.ts.map +1 -0
- package/dist/cli/tui/websocket.js +87 -0
- package/dist/contract/index.d.ts +2 -2
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/core/client.d.ts +1 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +4 -2
- package/dist/core/request-promise.d.ts +1 -1
- package/dist/core/request-promise.d.ts.map +1 -1
- package/dist/mcp/contract.d.ts +1 -1
- package/dist/mcp/contract.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts.map +1 -1
- package/dist/plugins/cache.js +0 -7
- package/dist/plugins/scrape.d.ts.map +1 -1
- package/dist/plugins/scrape.js +9 -14
- package/dist/protocols/ftp.d.ts +28 -5
- package/dist/protocols/ftp.d.ts.map +1 -1
- package/dist/protocols/ftp.js +549 -136
- package/dist/protocols/sftp.d.ts +4 -2
- package/dist/protocols/sftp.d.ts.map +1 -1
- package/dist/protocols/sftp.js +16 -2
- package/dist/protocols/telnet.d.ts +37 -5
- package/dist/protocols/telnet.d.ts.map +1 -1
- package/dist/protocols/telnet.js +434 -58
- package/dist/runner/request-runner.d.ts.map +1 -1
- package/dist/runner/request-runner.js +0 -1
- package/dist/scrape/document.d.ts +3 -2
- package/dist/scrape/document.d.ts.map +1 -1
- package/dist/scrape/document.js +15 -3
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/mock-udp-server.d.ts +44 -0
- package/dist/testing/mock-udp-server.d.ts.map +1 -0
- package/dist/testing/mock-udp-server.js +188 -0
- package/dist/transport/base-udp.d.ts +36 -0
- package/dist/transport/base-udp.d.ts.map +1 -0
- package/dist/transport/base-udp.js +188 -0
- package/dist/transport/udp-response.d.ts +65 -0
- package/dist/transport/udp-response.d.ts.map +1 -0
- package/dist/transport/udp-response.js +269 -0
- package/dist/transport/udp.d.ts +22 -0
- package/dist/transport/udp.d.ts.map +1 -0
- package/dist/transport/udp.js +260 -0
- package/dist/types/ai.d.ts +268 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js +1 -0
- package/dist/types/udp.d.ts +138 -0
- package/dist/types/udp.d.ts.map +1 -0
- package/dist/types/udp.js +1 -0
- package/dist/udp/index.d.ts +6 -0
- package/dist/udp/index.d.ts.map +1 -0
- package/dist/udp/index.js +3 -0
- package/dist/utils/chart.d.ts +15 -0
- package/dist/utils/chart.d.ts.map +1 -0
- package/dist/utils/chart.js +94 -0
- package/dist/utils/colors.d.ts +27 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +50 -0
- package/dist/utils/optional-require.d.ts +20 -0
- package/dist/utils/optional-require.d.ts.map +1 -0
- package/dist/utils/optional-require.js +105 -0
- package/package.json +53 -12
package/dist/protocols/telnet.js
CHANGED
|
@@ -1,65 +1,161 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Socket } from 'node:net';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
const IAC = 255;
|
|
4
|
+
const CMD = {
|
|
5
|
+
SE: 240,
|
|
6
|
+
NOP: 241,
|
|
7
|
+
DM: 242,
|
|
8
|
+
BRK: 243,
|
|
9
|
+
IP: 244,
|
|
10
|
+
AO: 245,
|
|
11
|
+
AYT: 246,
|
|
12
|
+
EC: 247,
|
|
13
|
+
EL: 248,
|
|
14
|
+
GA: 249,
|
|
15
|
+
SB: 250,
|
|
16
|
+
WILL: 251,
|
|
17
|
+
WONT: 252,
|
|
18
|
+
DO: 253,
|
|
19
|
+
DONT: 254,
|
|
20
|
+
IAC: 255,
|
|
21
|
+
};
|
|
22
|
+
const OPT = {
|
|
23
|
+
BINARY: 0,
|
|
24
|
+
ECHO: 1,
|
|
25
|
+
RCP: 2,
|
|
26
|
+
SGA: 3,
|
|
27
|
+
NAMS: 4,
|
|
28
|
+
STATUS: 5,
|
|
29
|
+
TM: 6,
|
|
30
|
+
RCTE: 7,
|
|
31
|
+
NAOL: 8,
|
|
32
|
+
NAOP: 9,
|
|
33
|
+
NAOCRD: 10,
|
|
34
|
+
NAOHTS: 11,
|
|
35
|
+
NAOHTD: 12,
|
|
36
|
+
NAOFFD: 13,
|
|
37
|
+
NAOVTS: 14,
|
|
38
|
+
NAOVTD: 15,
|
|
39
|
+
NAOLFD: 16,
|
|
40
|
+
XASCII: 17,
|
|
41
|
+
LOGOUT: 18,
|
|
42
|
+
BM: 19,
|
|
43
|
+
DET: 20,
|
|
44
|
+
SUPDUP: 21,
|
|
45
|
+
SUPDUPOUTPUT: 22,
|
|
46
|
+
SNDLOC: 23,
|
|
47
|
+
TTYPE: 24,
|
|
48
|
+
EOR: 25,
|
|
49
|
+
TUID: 26,
|
|
50
|
+
OUTMRK: 27,
|
|
51
|
+
TTYLOC: 28,
|
|
52
|
+
OPT3270REGIME: 29,
|
|
53
|
+
X3PAD: 30,
|
|
54
|
+
NAWS: 31,
|
|
55
|
+
TSPEED: 32,
|
|
56
|
+
LFLOW: 33,
|
|
57
|
+
LINEMODE: 34,
|
|
58
|
+
XDISPLOC: 35,
|
|
59
|
+
OLD_ENVIRON: 36,
|
|
60
|
+
AUTHENTICATION: 37,
|
|
61
|
+
ENCRYPT: 38,
|
|
62
|
+
NEW_ENVIRON: 39,
|
|
63
|
+
EXOPL: 255,
|
|
64
|
+
};
|
|
65
|
+
export class Telnet extends EventEmitter {
|
|
66
|
+
socket = null;
|
|
4
67
|
config;
|
|
5
68
|
connected = false;
|
|
69
|
+
buffer = Buffer.alloc(0);
|
|
70
|
+
dataBuffer = '';
|
|
71
|
+
loginState = 'pending';
|
|
72
|
+
localOptions = new Set();
|
|
73
|
+
remoteOptions = new Set();
|
|
6
74
|
constructor(config) {
|
|
7
|
-
|
|
8
|
-
this.
|
|
75
|
+
super();
|
|
76
|
+
this.config = {
|
|
77
|
+
host: config.host,
|
|
78
|
+
port: config.port ?? 23,
|
|
79
|
+
timeout: config.timeout ?? 10000,
|
|
80
|
+
shellPrompt: config.shellPrompt ?? /[$#>]\s*$/,
|
|
81
|
+
loginPrompt: config.loginPrompt ?? /login[: ]*$/i,
|
|
82
|
+
passwordPrompt: config.passwordPrompt ?? /password[: ]*$/i,
|
|
83
|
+
username: config.username ?? '',
|
|
84
|
+
password: config.password ?? '',
|
|
85
|
+
initialLFCR: config.initialLFCR ?? true,
|
|
86
|
+
pageSeparator: config.pageSeparator ?? '',
|
|
87
|
+
execTimeout: config.execTimeout ?? 5000,
|
|
88
|
+
sendTimeout: config.sendTimeout ?? 2000,
|
|
89
|
+
maxBufferLength: config.maxBufferLength ?? 1024 * 1024,
|
|
90
|
+
debug: config.debug ?? false,
|
|
91
|
+
terminalType: config.terminalType ?? 'xterm-256color',
|
|
92
|
+
windowSize: config.windowSize ?? [80, 24],
|
|
93
|
+
};
|
|
9
94
|
}
|
|
10
95
|
async connect() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
this.socket = new Socket();
|
|
98
|
+
this.socket.setTimeout(this.config.timeout);
|
|
99
|
+
this.socket.on('connect', () => {
|
|
100
|
+
this.debug('Connected to %s:%d', this.config.host, this.config.port);
|
|
101
|
+
this.connected = true;
|
|
102
|
+
if (this.config.initialLFCR) {
|
|
103
|
+
this.socket?.write(Buffer.from([13, 10]));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
this.socket.on('data', (data) => this.handleData(data));
|
|
107
|
+
this.socket.on('close', () => {
|
|
108
|
+
this.debug('Connection closed');
|
|
109
|
+
this.connected = false;
|
|
110
|
+
this.emit('close');
|
|
111
|
+
});
|
|
112
|
+
this.socket.on('error', (err) => {
|
|
113
|
+
this.debug('Socket error: %s', err.message);
|
|
114
|
+
this.emit('error', err);
|
|
115
|
+
resolve({
|
|
116
|
+
success: false,
|
|
117
|
+
message: err.message
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
this.socket.on('timeout', () => {
|
|
121
|
+
this.debug('Connection timeout');
|
|
122
|
+
this.socket?.destroy();
|
|
123
|
+
resolve({
|
|
124
|
+
success: false,
|
|
125
|
+
message: 'Connection timeout'
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
this.socket.connect(this.config.port, this.config.host);
|
|
129
|
+
this.waitForPromptOrAuth()
|
|
130
|
+
.then(() => {
|
|
131
|
+
resolve({
|
|
132
|
+
success: true,
|
|
133
|
+
message: 'Connected successfully'
|
|
134
|
+
});
|
|
135
|
+
})
|
|
136
|
+
.catch((err) => {
|
|
137
|
+
resolve({
|
|
138
|
+
success: false,
|
|
139
|
+
message: err.message
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
42
143
|
}
|
|
43
144
|
isConnected() {
|
|
44
|
-
return this.connected;
|
|
145
|
+
return this.connected && this.socket !== null && !this.socket.destroyed;
|
|
45
146
|
}
|
|
46
147
|
async exec(command, options) {
|
|
47
148
|
this.ensureConnected();
|
|
149
|
+
const prompt = options?.shellPrompt ?? this.config.shellPrompt;
|
|
150
|
+
const timeout = options?.timeout ?? this.config.execTimeout;
|
|
48
151
|
try {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (options?.timeout) {
|
|
54
|
-
execOptions.timeout = options.timeout;
|
|
55
|
-
}
|
|
56
|
-
if (options?.sendTimeout) {
|
|
57
|
-
execOptions.sendTimeout = options.sendTimeout;
|
|
58
|
-
}
|
|
59
|
-
const result = await this.client.exec(command, execOptions);
|
|
152
|
+
this.dataBuffer = '';
|
|
153
|
+
this.write(command + '\r\n');
|
|
154
|
+
const output = await this.waitForPattern(prompt, timeout);
|
|
155
|
+
const cleaned = this.cleanOutput(output, command, prompt);
|
|
60
156
|
return {
|
|
61
157
|
success: true,
|
|
62
|
-
data:
|
|
158
|
+
data: cleaned
|
|
63
159
|
};
|
|
64
160
|
}
|
|
65
161
|
catch (error) {
|
|
@@ -72,10 +168,17 @@ export class Telnet {
|
|
|
72
168
|
async send(data, options) {
|
|
73
169
|
this.ensureConnected();
|
|
74
170
|
try {
|
|
75
|
-
|
|
171
|
+
this.write(data);
|
|
172
|
+
if (options?.waitFor) {
|
|
173
|
+
const output = await this.waitForPattern(options.waitFor, options.timeout ?? this.config.sendTimeout);
|
|
174
|
+
return {
|
|
175
|
+
success: true,
|
|
176
|
+
data: output
|
|
177
|
+
};
|
|
178
|
+
}
|
|
76
179
|
return {
|
|
77
180
|
success: true,
|
|
78
|
-
data:
|
|
181
|
+
data: ''
|
|
79
182
|
};
|
|
80
183
|
}
|
|
81
184
|
catch (error) {
|
|
@@ -91,10 +194,10 @@ export class Telnet {
|
|
|
91
194
|
async waitFor(pattern, timeout) {
|
|
92
195
|
this.ensureConnected();
|
|
93
196
|
try {
|
|
94
|
-
const
|
|
197
|
+
const output = await this.waitForPattern(pattern, timeout ?? this.config.execTimeout);
|
|
95
198
|
return {
|
|
96
199
|
success: true,
|
|
97
|
-
data:
|
|
200
|
+
data: output
|
|
98
201
|
};
|
|
99
202
|
}
|
|
100
203
|
catch (error) {
|
|
@@ -104,22 +207,295 @@ export class Telnet {
|
|
|
104
207
|
};
|
|
105
208
|
}
|
|
106
209
|
}
|
|
107
|
-
|
|
108
|
-
|
|
210
|
+
getSocket() {
|
|
211
|
+
if (!this.socket) {
|
|
212
|
+
throw new Error('Not connected. Call connect() first.');
|
|
213
|
+
}
|
|
214
|
+
return this.socket;
|
|
109
215
|
}
|
|
110
216
|
async close() {
|
|
111
217
|
this.connected = false;
|
|
112
|
-
|
|
218
|
+
if (this.socket) {
|
|
219
|
+
this.socket.end();
|
|
220
|
+
this.socket = null;
|
|
221
|
+
}
|
|
113
222
|
}
|
|
114
223
|
destroy() {
|
|
115
224
|
this.connected = false;
|
|
116
|
-
this.
|
|
225
|
+
if (this.socket) {
|
|
226
|
+
this.socket.destroy();
|
|
227
|
+
this.socket = null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
handleData(data) {
|
|
231
|
+
this.debug('Received %d bytes', data.length);
|
|
232
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
233
|
+
if (this.buffer.length > this.config.maxBufferLength) {
|
|
234
|
+
this.buffer = this.buffer.slice(-this.config.maxBufferLength);
|
|
235
|
+
}
|
|
236
|
+
const text = this.processBuffer();
|
|
237
|
+
if (text.length > 0) {
|
|
238
|
+
this.dataBuffer += text;
|
|
239
|
+
this.emit('data', Buffer.from(text));
|
|
240
|
+
this.handleLoginPrompts();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
processBuffer() {
|
|
244
|
+
const textChunks = [];
|
|
245
|
+
let i = 0;
|
|
246
|
+
while (i < this.buffer.length) {
|
|
247
|
+
if (this.buffer[i] === IAC) {
|
|
248
|
+
if (i + 1 >= this.buffer.length) {
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
const cmd = this.buffer[i + 1];
|
|
252
|
+
if (cmd === IAC) {
|
|
253
|
+
textChunks.push(Buffer.from([IAC]));
|
|
254
|
+
i += 2;
|
|
255
|
+
}
|
|
256
|
+
else if (cmd === CMD.SB) {
|
|
257
|
+
const seIndex = this.findSubnegotiationEnd(i + 2);
|
|
258
|
+
if (seIndex === -1) {
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
this.handleSubnegotiation(this.buffer.slice(i + 2, seIndex));
|
|
262
|
+
i = seIndex + 2;
|
|
263
|
+
}
|
|
264
|
+
else if (cmd >= CMD.WILL && cmd <= CMD.DONT) {
|
|
265
|
+
if (i + 2 >= this.buffer.length) {
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
const option = this.buffer[i + 2];
|
|
269
|
+
this.handleNegotiation(cmd, option);
|
|
270
|
+
i += 3;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
this.debug('IAC command: %d', cmd);
|
|
274
|
+
i += 2;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
textChunks.push(Buffer.from([this.buffer[i]]));
|
|
279
|
+
i++;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
this.buffer = this.buffer.slice(i);
|
|
283
|
+
if (textChunks.length === 0)
|
|
284
|
+
return '';
|
|
285
|
+
const combined = Buffer.concat(textChunks);
|
|
286
|
+
return combined.toString('utf8').replace(/\x00/g, '');
|
|
287
|
+
}
|
|
288
|
+
findSubnegotiationEnd(start) {
|
|
289
|
+
for (let i = start; i < this.buffer.length - 1; i++) {
|
|
290
|
+
if (this.buffer[i] === IAC && this.buffer[i + 1] === CMD.SE) {
|
|
291
|
+
return i;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return -1;
|
|
295
|
+
}
|
|
296
|
+
handleNegotiation(command, option) {
|
|
297
|
+
this.debug('Negotiation: %s %d', this.cmdName(command), option);
|
|
298
|
+
this.emit('command', command, option);
|
|
299
|
+
switch (command) {
|
|
300
|
+
case CMD.DO:
|
|
301
|
+
if (this.shouldEnableOption(option)) {
|
|
302
|
+
this.sendCommand(CMD.WILL, option);
|
|
303
|
+
this.localOptions.add(option);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
this.sendCommand(CMD.WONT, option);
|
|
307
|
+
}
|
|
308
|
+
break;
|
|
309
|
+
case CMD.DONT:
|
|
310
|
+
this.sendCommand(CMD.WONT, option);
|
|
311
|
+
this.localOptions.delete(option);
|
|
312
|
+
break;
|
|
313
|
+
case CMD.WILL:
|
|
314
|
+
if (this.shouldAcceptOption(option)) {
|
|
315
|
+
this.sendCommand(CMD.DO, option);
|
|
316
|
+
this.remoteOptions.add(option);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
this.sendCommand(CMD.DONT, option);
|
|
320
|
+
}
|
|
321
|
+
break;
|
|
322
|
+
case CMD.WONT:
|
|
323
|
+
this.sendCommand(CMD.DONT, option);
|
|
324
|
+
this.remoteOptions.delete(option);
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
shouldEnableOption(option) {
|
|
329
|
+
switch (option) {
|
|
330
|
+
case OPT.TTYPE:
|
|
331
|
+
case OPT.NAWS:
|
|
332
|
+
case OPT.SGA:
|
|
333
|
+
return true;
|
|
334
|
+
default:
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
shouldAcceptOption(option) {
|
|
339
|
+
switch (option) {
|
|
340
|
+
case OPT.ECHO:
|
|
341
|
+
case OPT.SGA:
|
|
342
|
+
case OPT.BINARY:
|
|
343
|
+
return true;
|
|
344
|
+
default:
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
handleSubnegotiation(data) {
|
|
349
|
+
if (data.length < 1)
|
|
350
|
+
return;
|
|
351
|
+
const option = data[0];
|
|
352
|
+
this.debug('Subnegotiation for option %d', option);
|
|
353
|
+
switch (option) {
|
|
354
|
+
case OPT.TTYPE:
|
|
355
|
+
if (data.length >= 2 && data[1] === 1) {
|
|
356
|
+
this.sendSubnegotiation(OPT.TTYPE, Buffer.from([0, ...Buffer.from(this.config.terminalType)]));
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
case OPT.NAWS:
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
sendCommand(command, option) {
|
|
364
|
+
this.debug('Sending: %s %d', this.cmdName(command), option);
|
|
365
|
+
this.socket?.write(Buffer.from([IAC, command, option]));
|
|
366
|
+
}
|
|
367
|
+
sendSubnegotiation(option, data) {
|
|
368
|
+
const packet = Buffer.concat([
|
|
369
|
+
Buffer.from([IAC, CMD.SB, option]),
|
|
370
|
+
data,
|
|
371
|
+
Buffer.from([IAC, CMD.SE])
|
|
372
|
+
]);
|
|
373
|
+
this.socket?.write(packet);
|
|
374
|
+
}
|
|
375
|
+
sendWindowSize() {
|
|
376
|
+
const [width, height] = this.config.windowSize;
|
|
377
|
+
const data = Buffer.alloc(4);
|
|
378
|
+
data.writeUInt16BE(width, 0);
|
|
379
|
+
data.writeUInt16BE(height, 2);
|
|
380
|
+
this.sendSubnegotiation(OPT.NAWS, data);
|
|
381
|
+
}
|
|
382
|
+
handleLoginPrompts() {
|
|
383
|
+
if (this.loginState === 'authenticated')
|
|
384
|
+
return;
|
|
385
|
+
if (!this.config.username && !this.config.password) {
|
|
386
|
+
this.loginState = 'authenticated';
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const text = this.dataBuffer;
|
|
390
|
+
if (this.loginState === 'pending' || this.loginState === 'username') {
|
|
391
|
+
if (this.matchPattern(text, this.config.loginPrompt)) {
|
|
392
|
+
if (this.config.username) {
|
|
393
|
+
this.debug('Detected login prompt, sending username');
|
|
394
|
+
this.write(this.config.username + '\r\n');
|
|
395
|
+
this.loginState = 'password';
|
|
396
|
+
this.dataBuffer = '';
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (this.loginState === 'password') {
|
|
401
|
+
if (this.matchPattern(text, this.config.passwordPrompt)) {
|
|
402
|
+
if (this.config.password) {
|
|
403
|
+
this.debug('Detected password prompt, sending password');
|
|
404
|
+
this.write(this.config.password + '\r\n');
|
|
405
|
+
this.loginState = 'authenticated';
|
|
406
|
+
this.dataBuffer = '';
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async waitForPromptOrAuth() {
|
|
412
|
+
const timeout = this.config.timeout;
|
|
413
|
+
const start = Date.now();
|
|
414
|
+
return new Promise((resolve, reject) => {
|
|
415
|
+
const check = () => {
|
|
416
|
+
if (Date.now() - start > timeout) {
|
|
417
|
+
reject(new Error('Timeout waiting for prompt'));
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (this.matchPattern(this.dataBuffer, this.config.shellPrompt)) {
|
|
421
|
+
this.loginState = 'authenticated';
|
|
422
|
+
resolve();
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
setTimeout(check, 100);
|
|
426
|
+
};
|
|
427
|
+
check();
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
write(data) {
|
|
431
|
+
if (!this.socket || !this.connected) {
|
|
432
|
+
throw new Error('Not connected');
|
|
433
|
+
}
|
|
434
|
+
const buffer = typeof data === 'string' ? Buffer.from(data) : data;
|
|
435
|
+
this.debug('Sending: %s', buffer.toString().replace(/\r\n/g, '\\r\\n'));
|
|
436
|
+
this.socket.write(buffer);
|
|
437
|
+
}
|
|
438
|
+
waitForPattern(pattern, timeout) {
|
|
439
|
+
return new Promise((resolve, reject) => {
|
|
440
|
+
const start = Date.now();
|
|
441
|
+
const startBuffer = this.dataBuffer;
|
|
442
|
+
const check = () => {
|
|
443
|
+
if (Date.now() - start > timeout) {
|
|
444
|
+
reject(new Error(`Timeout waiting for pattern: ${pattern}`));
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
if (this.matchPattern(this.dataBuffer, pattern)) {
|
|
448
|
+
resolve(this.dataBuffer);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
setTimeout(check, 50);
|
|
452
|
+
};
|
|
453
|
+
check();
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
matchPattern(text, pattern) {
|
|
457
|
+
if (typeof pattern === 'string') {
|
|
458
|
+
return text.includes(pattern);
|
|
459
|
+
}
|
|
460
|
+
return pattern.test(text);
|
|
461
|
+
}
|
|
462
|
+
cleanOutput(output, command, prompt) {
|
|
463
|
+
let cleaned = output;
|
|
464
|
+
const lines = cleaned.split(/\r?\n/);
|
|
465
|
+
if (lines.length > 0 && lines[0].includes(command)) {
|
|
466
|
+
lines.shift();
|
|
467
|
+
}
|
|
468
|
+
cleaned = lines.join('\n');
|
|
469
|
+
if (typeof prompt === 'string') {
|
|
470
|
+
const idx = cleaned.lastIndexOf(prompt);
|
|
471
|
+
if (idx !== -1) {
|
|
472
|
+
cleaned = cleaned.substring(0, idx);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
cleaned = cleaned.replace(prompt, '');
|
|
477
|
+
}
|
|
478
|
+
return cleaned.trim();
|
|
117
479
|
}
|
|
118
480
|
ensureConnected() {
|
|
119
|
-
if (!this.connected) {
|
|
481
|
+
if (!this.connected || !this.socket) {
|
|
120
482
|
throw new Error('Not connected to Telnet server. Call connect() first.');
|
|
121
483
|
}
|
|
122
484
|
}
|
|
485
|
+
cmdName(cmd) {
|
|
486
|
+
switch (cmd) {
|
|
487
|
+
case CMD.WILL: return 'WILL';
|
|
488
|
+
case CMD.WONT: return 'WONT';
|
|
489
|
+
case CMD.DO: return 'DO';
|
|
490
|
+
case CMD.DONT: return 'DONT';
|
|
491
|
+
default: return `CMD(${cmd})`;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
debug(format, ...args) {
|
|
495
|
+
if (this.config.debug) {
|
|
496
|
+
console.log(`[Telnet] ${format}`, ...args);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
123
499
|
}
|
|
124
500
|
export function createTelnet(config) {
|
|
125
501
|
return new Telnet(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../src/runner/request-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,GAAE,aAAkB;IAKhC,GAAG,CAAC,CAAC,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,IAAI;IAWM,GAAG,CAAC,CAAC,EAChB,KAAK,EAAE,GAAG,EAAE,EACZ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAClC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YA+Bb,WAAW;
|
|
1
|
+
{"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../src/runner/request-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,GAAE,aAAkB;IAKhC,GAAG,CAAC,CAAC,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/C,IAAI;IAWM,GAAG,CAAC,CAAC,EAChB,KAAK,EAAE,GAAG,EAAE,EACZ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAClC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YA+Bb,WAAW;IA8BlB,WAAW;;;;;;;CAUnB"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CheerioAPI } from 'cheerio';
|
|
2
2
|
import { ScrapeElement } from './element.js';
|
|
3
3
|
import type { ScrapeOptions, ExtractionSchema, ExtractedLink, ExtractedImage, ExtractedMeta, OpenGraphData, TwitterCardData, JsonLdData, ExtractedForm, ExtractedTable, ExtractedScript, ExtractedStyle, LinkExtractionOptions, ImageExtractionOptions } from './types.js';
|
|
4
4
|
export declare class ScrapeDocument {
|
|
5
5
|
private $;
|
|
6
6
|
private options;
|
|
7
|
-
constructor(
|
|
7
|
+
constructor($: CheerioAPI, options?: ScrapeOptions);
|
|
8
|
+
static create(html: string, options?: ScrapeOptions): Promise<ScrapeDocument>;
|
|
8
9
|
select(selector: string): ScrapeElement;
|
|
9
10
|
selectFirst(selector: string): ScrapeElement;
|
|
10
11
|
selectAll(selector: string): ScrapeElement[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/scrape/document.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/scrape/document.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,SAAS,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAa7C,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAEhB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAqBpB,qBAAa,cAAc;IACzB,OAAO,CAAC,CAAC,CAAa;IACtB,OAAO,CAAC,OAAO,CAAgB;gBAKnB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa;WASrC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAWnF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAOvC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAO5C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAW5C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;IAOtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAS3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO9B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAcjC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO7D,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAcpD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO1C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAUnC,KAAK,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,EAAE;IAUvD,MAAM,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,cAAc,EAAE;IAU1D,IAAI,IAAI,aAAa;IAOrB,SAAS,IAAI,aAAa;IAO1B,WAAW,IAAI,eAAe;IAO9B,MAAM,IAAI,UAAU,EAAE;IAOtB,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAOzC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAO3C,OAAO,IAAI,eAAe,EAAE;IAO5B,MAAM,IAAI,cAAc,EAAE;IAkB1B,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC;IAUvE,OAAO,CAAC,YAAY;IAgDpB,KAAK,IAAI,MAAM,GAAG,SAAS;IAQ3B,IAAI,IAAI,aAAa;IAOrB,IAAI,IAAI,aAAa;IAOrB,IAAI,IAAI,MAAM;IAOd,IAAI,IAAI,aAAa;IAOrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOjC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAS/B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAiB5D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAiBjE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAazD,IAAI,GAAG,IAAI,UAAU,CAEpB;IAKD,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;CACF"}
|
package/dist/scrape/document.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { requireOptional } from '../utils/optional-require.js';
|
|
2
2
|
import { ScrapeElement } from './element.js';
|
|
3
3
|
import { extractLinks, extractImages, extractMeta, extractOpenGraph, extractTwitterCard, extractJsonLd, extractForms, extractTables, extractScripts, extractStyles, } from './extractors.js';
|
|
4
|
+
let cheerioModule = null;
|
|
5
|
+
async function loadCheerio() {
|
|
6
|
+
if (cheerioModule) {
|
|
7
|
+
return cheerioModule;
|
|
8
|
+
}
|
|
9
|
+
cheerioModule = await requireOptional('cheerio', 'recker/scrape');
|
|
10
|
+
return cheerioModule;
|
|
11
|
+
}
|
|
4
12
|
export class ScrapeDocument {
|
|
5
13
|
$;
|
|
6
14
|
options;
|
|
7
|
-
constructor(
|
|
8
|
-
this.$ =
|
|
15
|
+
constructor($, options) {
|
|
16
|
+
this.$ = $;
|
|
9
17
|
this.options = options || {};
|
|
10
18
|
}
|
|
19
|
+
static async create(html, options) {
|
|
20
|
+
const { load } = await loadCheerio();
|
|
21
|
+
return new ScrapeDocument(load(html), options);
|
|
22
|
+
}
|
|
11
23
|
select(selector) {
|
|
12
24
|
return new ScrapeElement(this.$(selector), this.$);
|
|
13
25
|
}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { MockClient, MockTransport, createMockClient, installGlobalMock, uninstallGlobalMock, MockAgent, } from './mock.js';
|
|
2
2
|
export type { MockResponseOptions, MockInterceptOptions, } from './mock.js';
|
|
3
|
+
export { MockUDPServer, createMockUDPServer, } from './mock-udp-server.js';
|
|
4
|
+
export type { MockUDPServerOptions, ReceivedMessage, } from './mock-udp-server.js';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EACL,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EACL,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
|
package/dist/testing/index.js
CHANGED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import dgram from 'node:dgram';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
export interface MockUDPServerOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
type?: 'udp4' | 'udp6';
|
|
7
|
+
echo?: boolean;
|
|
8
|
+
delay?: number;
|
|
9
|
+
dropRate?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ReceivedMessage {
|
|
12
|
+
data: Buffer;
|
|
13
|
+
rinfo: dgram.RemoteInfo;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class MockUDPServer extends EventEmitter {
|
|
17
|
+
private socket;
|
|
18
|
+
private options;
|
|
19
|
+
private responses;
|
|
20
|
+
private _port;
|
|
21
|
+
private _receivedMessages;
|
|
22
|
+
private _started;
|
|
23
|
+
constructor(options?: MockUDPServerOptions);
|
|
24
|
+
get port(): number;
|
|
25
|
+
get address(): string;
|
|
26
|
+
get isRunning(): boolean;
|
|
27
|
+
get receivedMessages(): ReceivedMessage[];
|
|
28
|
+
get messageCount(): number;
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
setResponse(pattern: string | RegExp, response: Buffer | string | ((msg: Buffer, rinfo: dgram.RemoteInfo) => Buffer | string | null)): void;
|
|
32
|
+
setDelay(delay: number): void;
|
|
33
|
+
setDropRate(rate: number): void;
|
|
34
|
+
setEcho(enabled: boolean): void;
|
|
35
|
+
clearMessages(): void;
|
|
36
|
+
clearResponses(): void;
|
|
37
|
+
reset(): void;
|
|
38
|
+
private getResponse;
|
|
39
|
+
sendTo(data: Buffer | string, port: number, address?: string): Promise<void>;
|
|
40
|
+
waitForMessages(count: number, timeout?: number): Promise<ReceivedMessage[]>;
|
|
41
|
+
static create(options?: MockUDPServerOptions): Promise<MockUDPServer>;
|
|
42
|
+
}
|
|
43
|
+
export declare function createMockUDPServer(responses?: Record<string, Buffer | string>, options?: MockUDPServerOptions): Promise<MockUDPServer>;
|
|
44
|
+
//# sourceMappingURL=mock-udp-server.d.ts.map
|