recker 1.0.15-next.eb07368 → 1.0.16
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 +10 -1
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +4 -1
- package/dist/ai/providers/base.d.ts.map +1 -1
- package/dist/ai/providers/base.js +7 -2
- package/dist/ai/rate-limiter.d.ts.map +1 -1
- package/dist/ai/rate-limiter.js +4 -1
- package/dist/bench/generator.d.ts.map +1 -1
- package/dist/bench/generator.js +7 -3
- package/dist/bench/stats.d.ts.map +1 -1
- package/dist/bench/stats.js +43 -10
- package/dist/cache/memory-storage.d.ts.map +1 -1
- package/dist/cache/memory-storage.js +3 -2
- package/dist/cli/handler.js +14 -14
- package/dist/cli/index.js +533 -79
- package/dist/cli/presets.js +5 -5
- package/dist/cli/tui/ai-chat.js +10 -10
- package/dist/cli/tui/load-dashboard.d.ts.map +1 -1
- package/dist/cli/tui/load-dashboard.js +96 -55
- package/dist/cli/tui/shell.d.ts +3 -0
- package/dist/cli/tui/shell.d.ts.map +1 -1
- package/dist/cli/tui/shell.js +163 -1
- package/dist/cli/tui/websocket.js +17 -17
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +18 -26
- package/dist/core/errors.d.ts +109 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +214 -1
- package/dist/core/request-promise.d.ts.map +1 -1
- package/dist/core/request-promise.js +5 -6
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +5 -6
- package/dist/dns/propagation.d.ts +3 -1
- package/dist/dns/propagation.d.ts.map +1 -1
- package/dist/dns/propagation.js +99 -59
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +10 -11
- package/dist/mcp/embeddings-loader.d.ts.map +1 -1
- package/dist/mcp/embeddings-loader.js +12 -2
- package/dist/mcp/geoip-loader.d.ts +11 -0
- package/dist/mcp/geoip-loader.d.ts.map +1 -0
- package/dist/mcp/geoip-loader.js +107 -0
- package/dist/mcp/ip-intel.d.ts +28 -0
- package/dist/mcp/ip-intel.d.ts.map +1 -0
- package/dist/mcp/ip-intel.js +209 -0
- package/dist/mcp/search/hybrid-search.d.ts.map +1 -1
- package/dist/mcp/search/hybrid-search.js +5 -1
- package/dist/mcp/search/math.d.ts.map +1 -1
- package/dist/mcp/search/math.js +5 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +114 -1
- package/dist/plugins/compression.js +4 -2
- package/dist/plugins/har-player.d.ts.map +1 -1
- package/dist/plugins/har-player.js +8 -11
- package/dist/plugins/odata.d.ts.map +1 -1
- package/dist/plugins/odata.js +5 -2
- package/dist/protocols/ftp.d.ts.map +1 -1
- package/dist/protocols/ftp.js +69 -16
- package/dist/protocols/sftp.d.ts.map +1 -1
- package/dist/protocols/sftp.js +13 -3
- package/dist/protocols/telnet.d.ts.map +1 -1
- package/dist/protocols/telnet.js +25 -6
- package/dist/transport/base-udp.d.ts.map +1 -1
- package/dist/transport/base-udp.js +7 -4
- package/dist/transport/udp-response.d.ts.map +1 -1
- package/dist/transport/udp-response.js +10 -3
- package/dist/transport/udp.d.ts.map +1 -1
- package/dist/transport/udp.js +5 -1
- package/dist/transport/undici.d.ts.map +1 -1
- package/dist/transport/undici.js +3 -11
- package/dist/utils/agent-manager.d.ts +1 -0
- package/dist/utils/agent-manager.d.ts.map +1 -1
- package/dist/utils/agent-manager.js +11 -0
- package/dist/utils/client-pool.d.ts.map +1 -1
- package/dist/utils/client-pool.js +4 -1
- package/dist/utils/dns-toolkit.d.ts +88 -1
- package/dist/utils/dns-toolkit.d.ts.map +1 -1
- package/dist/utils/dns-toolkit.js +704 -6
- package/dist/utils/doh.d.ts.map +1 -1
- package/dist/utils/doh.js +13 -16
- package/dist/utils/download.d.ts.map +1 -1
- package/dist/utils/download.js +10 -11
- package/dist/utils/rdap.d.ts +9 -0
- package/dist/utils/rdap.d.ts.map +1 -1
- package/dist/utils/rdap.js +78 -9
- package/dist/utils/security-grader.d.ts +33 -0
- package/dist/utils/security-grader.d.ts.map +1 -1
- package/dist/utils/security-grader.js +548 -43
- package/dist/utils/sparkline.d.ts +18 -0
- package/dist/utils/sparkline.d.ts.map +1 -0
- package/dist/utils/sparkline.js +55 -0
- package/dist/utils/sse.d.ts.map +1 -1
- package/dist/utils/sse.js +5 -6
- package/dist/utils/system-metrics.d.ts +26 -0
- package/dist/utils/system-metrics.d.ts.map +1 -0
- package/dist/utils/system-metrics.js +81 -0
- package/dist/webrtc/index.d.ts.map +1 -1
- package/dist/webrtc/index.js +21 -7
- package/dist/websocket/client.d.ts.map +1 -1
- package/dist/websocket/client.js +13 -16
- package/package.json +3 -2
- package/dist/utils/ip-intel.d.ts +0 -15
- package/dist/utils/ip-intel.d.ts.map +0 -1
- package/dist/utils/ip-intel.js +0 -30
package/dist/protocols/ftp.js
CHANGED
|
@@ -3,6 +3,7 @@ import { connect as tlsConnect } from 'node:tls';
|
|
|
3
3
|
import { Readable, Writable } from 'node:stream';
|
|
4
4
|
import { createWriteStream, createReadStream } from 'node:fs';
|
|
5
5
|
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { ProtocolError, StateError, AuthenticationError, ConnectionError, TimeoutError, ParseError, } from '../core/errors.js';
|
|
6
7
|
const ResponseCode = {
|
|
7
8
|
RESTART_MARKER: 110,
|
|
8
9
|
SERVICE_READY_IN: 120,
|
|
@@ -88,7 +89,11 @@ export class FTP extends EventEmitter {
|
|
|
88
89
|
const welcome = await this.readResponse();
|
|
89
90
|
this.debug('Welcome: %s', welcome.message);
|
|
90
91
|
if (welcome.code !== ResponseCode.SERVICE_READY) {
|
|
91
|
-
throw new
|
|
92
|
+
throw new ProtocolError(`Server not ready: ${welcome.message}`, {
|
|
93
|
+
protocol: 'ftp',
|
|
94
|
+
code: welcome.code,
|
|
95
|
+
phase: 'connect',
|
|
96
|
+
});
|
|
92
97
|
}
|
|
93
98
|
await this.authenticate();
|
|
94
99
|
await this.sendCommand('TYPE I');
|
|
@@ -173,7 +178,11 @@ export class FTP extends EventEmitter {
|
|
|
173
178
|
const response = await this.readResponse();
|
|
174
179
|
if (response.code !== ResponseCode.CLOSING_DATA_CONNECTION &&
|
|
175
180
|
response.code !== ResponseCode.FILE_ACTION_OK) {
|
|
176
|
-
throw new
|
|
181
|
+
throw new ProtocolError(response.message, {
|
|
182
|
+
protocol: 'ftp',
|
|
183
|
+
code: response.code,
|
|
184
|
+
phase: 'transfer',
|
|
185
|
+
});
|
|
177
186
|
}
|
|
178
187
|
return {
|
|
179
188
|
success: true,
|
|
@@ -259,7 +268,11 @@ export class FTP extends EventEmitter {
|
|
|
259
268
|
const response = await this.readResponse();
|
|
260
269
|
if (response.code !== ResponseCode.CLOSING_DATA_CONNECTION &&
|
|
261
270
|
response.code !== ResponseCode.FILE_ACTION_OK) {
|
|
262
|
-
throw new
|
|
271
|
+
throw new ProtocolError(response.message, {
|
|
272
|
+
protocol: 'ftp',
|
|
273
|
+
code: response.code,
|
|
274
|
+
phase: 'transfer',
|
|
275
|
+
});
|
|
263
276
|
}
|
|
264
277
|
return {
|
|
265
278
|
success: true,
|
|
@@ -356,7 +369,11 @@ export class FTP extends EventEmitter {
|
|
|
356
369
|
try {
|
|
357
370
|
const rnfrResponse = await this.sendCommand(`RNFR ${oldPath}`);
|
|
358
371
|
if (rnfrResponse.code !== ResponseCode.FILE_ACTION_PENDING) {
|
|
359
|
-
throw new
|
|
372
|
+
throw new ProtocolError(rnfrResponse.message, {
|
|
373
|
+
protocol: 'ftp',
|
|
374
|
+
code: rnfrResponse.code,
|
|
375
|
+
phase: 'rename',
|
|
376
|
+
});
|
|
360
377
|
}
|
|
361
378
|
const rntoResponse = await this.sendCommand(`RNTO ${newPath}`);
|
|
362
379
|
return {
|
|
@@ -459,7 +476,10 @@ export class FTP extends EventEmitter {
|
|
|
459
476
|
}
|
|
460
477
|
getSocket() {
|
|
461
478
|
if (!this.controlSocket) {
|
|
462
|
-
throw new
|
|
479
|
+
throw new StateError('Not connected. Call connect() first.', {
|
|
480
|
+
expectedState: 'connected',
|
|
481
|
+
actualState: 'disconnected',
|
|
482
|
+
});
|
|
463
483
|
}
|
|
464
484
|
return this.controlSocket;
|
|
465
485
|
}
|
|
@@ -476,7 +496,10 @@ export class FTP extends EventEmitter {
|
|
|
476
496
|
});
|
|
477
497
|
socket.on('timeout', () => {
|
|
478
498
|
socket.destroy();
|
|
479
|
-
reject(new
|
|
499
|
+
reject(new TimeoutError(undefined, {
|
|
500
|
+
phase: 'connect',
|
|
501
|
+
timeout: this.config.timeout,
|
|
502
|
+
}));
|
|
480
503
|
});
|
|
481
504
|
socket.connect(this.config.port, this.config.host);
|
|
482
505
|
});
|
|
@@ -499,14 +522,21 @@ export class FTP extends EventEmitter {
|
|
|
499
522
|
socket.setTimeout(this.config.timeout);
|
|
500
523
|
socket.on('timeout', () => {
|
|
501
524
|
socket.destroy();
|
|
502
|
-
reject(new
|
|
525
|
+
reject(new TimeoutError(undefined, {
|
|
526
|
+
phase: 'secureConnect',
|
|
527
|
+
timeout: this.config.timeout,
|
|
528
|
+
}));
|
|
503
529
|
});
|
|
504
530
|
});
|
|
505
531
|
}
|
|
506
532
|
async upgradeToTLS() {
|
|
507
533
|
const authResponse = await this.sendCommand('AUTH TLS');
|
|
508
534
|
if (authResponse.code !== ResponseCode.AUTH_OK) {
|
|
509
|
-
throw new
|
|
535
|
+
throw new ProtocolError(`AUTH TLS failed: ${authResponse.message}`, {
|
|
536
|
+
protocol: 'ftp',
|
|
537
|
+
code: authResponse.code,
|
|
538
|
+
phase: 'tls-upgrade',
|
|
539
|
+
});
|
|
510
540
|
}
|
|
511
541
|
return new Promise((resolve, reject) => {
|
|
512
542
|
const options = {
|
|
@@ -528,11 +558,15 @@ export class FTP extends EventEmitter {
|
|
|
528
558
|
return;
|
|
529
559
|
}
|
|
530
560
|
if (userResponse.code !== ResponseCode.NEED_PASSWORD) {
|
|
531
|
-
throw new
|
|
561
|
+
throw new AuthenticationError(`Authentication failed: ${userResponse.message}`, {
|
|
562
|
+
authType: 'ftp-user',
|
|
563
|
+
});
|
|
532
564
|
}
|
|
533
565
|
const passResponse = await this.sendCommand(`PASS ${this.config.password}`);
|
|
534
566
|
if (passResponse.code !== ResponseCode.USER_LOGGED_IN) {
|
|
535
|
-
throw new
|
|
567
|
+
throw new AuthenticationError(`Authentication failed: ${passResponse.message}`, {
|
|
568
|
+
authType: 'ftp-password',
|
|
569
|
+
});
|
|
536
570
|
}
|
|
537
571
|
if (this.secureConnection) {
|
|
538
572
|
await this.sendCommand('PBSZ 0');
|
|
@@ -542,11 +576,17 @@ export class FTP extends EventEmitter {
|
|
|
542
576
|
async openDataConnection() {
|
|
543
577
|
const pasvResponse = await this.sendCommand('PASV');
|
|
544
578
|
if (pasvResponse.code !== ResponseCode.ENTERING_PASSIVE) {
|
|
545
|
-
throw new
|
|
579
|
+
throw new ProtocolError(`PASV failed: ${pasvResponse.message}`, {
|
|
580
|
+
protocol: 'ftp',
|
|
581
|
+
code: pasvResponse.code,
|
|
582
|
+
phase: 'pasv',
|
|
583
|
+
});
|
|
546
584
|
}
|
|
547
585
|
const match = pasvResponse.message.match(/\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/);
|
|
548
586
|
if (!match) {
|
|
549
|
-
throw new
|
|
587
|
+
throw new ParseError('Failed to parse PASV response', {
|
|
588
|
+
format: 'pasv',
|
|
589
|
+
});
|
|
550
590
|
}
|
|
551
591
|
const host = `${match[1]}.${match[2]}.${match[3]}.${match[4]}`;
|
|
552
592
|
const port = parseInt(match[5], 10) * 256 + parseInt(match[6], 10);
|
|
@@ -584,7 +624,11 @@ export class FTP extends EventEmitter {
|
|
|
584
624
|
const response = await this.readResponse();
|
|
585
625
|
if (response.code !== ResponseCode.CLOSING_DATA_CONNECTION &&
|
|
586
626
|
response.code !== ResponseCode.FILE_ACTION_OK) {
|
|
587
|
-
reject(new
|
|
627
|
+
reject(new ProtocolError(response.message, {
|
|
628
|
+
protocol: 'ftp',
|
|
629
|
+
code: response.code,
|
|
630
|
+
phase: 'data-transfer',
|
|
631
|
+
}));
|
|
588
632
|
}
|
|
589
633
|
else {
|
|
590
634
|
resolve(data);
|
|
@@ -599,7 +643,10 @@ export class FTP extends EventEmitter {
|
|
|
599
643
|
}
|
|
600
644
|
async sendCommand(command) {
|
|
601
645
|
if (!this.controlSocket) {
|
|
602
|
-
throw new
|
|
646
|
+
throw new StateError('Not connected', {
|
|
647
|
+
expectedState: 'connected',
|
|
648
|
+
actualState: 'disconnected',
|
|
649
|
+
});
|
|
603
650
|
}
|
|
604
651
|
const displayCommand = command.startsWith('PASS ')
|
|
605
652
|
? 'PASS ****'
|
|
@@ -765,7 +812,10 @@ export class FTP extends EventEmitter {
|
|
|
765
812
|
}
|
|
766
813
|
ensureConnected() {
|
|
767
814
|
if (!this.connected || !this.controlSocket || this.controlSocket.destroyed) {
|
|
768
|
-
throw new
|
|
815
|
+
throw new StateError('Not connected to FTP server. Call connect() first.', {
|
|
816
|
+
expectedState: 'connected',
|
|
817
|
+
actualState: 'disconnected',
|
|
818
|
+
});
|
|
769
819
|
}
|
|
770
820
|
}
|
|
771
821
|
cleanup() {
|
|
@@ -791,7 +841,10 @@ export async function ftp(config, operation) {
|
|
|
791
841
|
try {
|
|
792
842
|
const result = await client.connect();
|
|
793
843
|
if (!result.success) {
|
|
794
|
-
throw new
|
|
844
|
+
throw new ConnectionError(result.message || 'Failed to connect to FTP server', {
|
|
845
|
+
host: config.host,
|
|
846
|
+
port: config.port,
|
|
847
|
+
});
|
|
795
848
|
}
|
|
796
849
|
return await operation(client);
|
|
797
850
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftp.d.ts","sourceRoot":"","sources":["../../src/protocols/sftp.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sftp.d.ts","sourceRoot":"","sources":["../../src/protocols/sftp.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKjD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAA4B,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY5E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,IAAI;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmBD,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,UAAU;YAOhB,iBAAiB;IAWzB,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAmCtC,WAAW,IAAI,OAAO;IAOhB,IAAI,CAAC,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;IAgCrE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAarD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAoB1D,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBtE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAqB7E,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IA6BnE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBpE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqB7E,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBlF,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBjD,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB3E,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB5E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB/D,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBvE,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAoBpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,SAAS,IAAI,UAAU;IAUvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;CAYpB;AAaD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAEnD;AAkBD,wBAAsB,IAAI,CAAC,CAAC,EAC1B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
package/dist/protocols/sftp.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { requireOptional } from '../utils/optional-require.js';
|
|
2
|
+
import { StateError, ConnectionError } from '../core/errors.js';
|
|
2
3
|
async function loadSFTP() {
|
|
3
4
|
return requireOptional('ssh2-sftp-client', 'recker/protocols/sftp');
|
|
4
5
|
}
|
|
@@ -320,13 +321,19 @@ export class SFTP {
|
|
|
320
321
|
}
|
|
321
322
|
getClient() {
|
|
322
323
|
if (!this.initialized) {
|
|
323
|
-
throw new
|
|
324
|
+
throw new StateError('Client not initialized. Call connect() first.', {
|
|
325
|
+
expectedState: 'initialized',
|
|
326
|
+
actualState: 'not-initialized',
|
|
327
|
+
});
|
|
324
328
|
}
|
|
325
329
|
return this.client;
|
|
326
330
|
}
|
|
327
331
|
ensureConnected() {
|
|
328
332
|
if (!this.connected) {
|
|
329
|
-
throw new
|
|
333
|
+
throw new StateError('Not connected to SFTP server. Call connect() first.', {
|
|
334
|
+
expectedState: 'connected',
|
|
335
|
+
actualState: 'disconnected',
|
|
336
|
+
});
|
|
330
337
|
}
|
|
331
338
|
}
|
|
332
339
|
mapFileType(type) {
|
|
@@ -350,7 +357,10 @@ export async function sftp(config, operation) {
|
|
|
350
357
|
try {
|
|
351
358
|
const result = await client.connect();
|
|
352
359
|
if (!result.success) {
|
|
353
|
-
throw new
|
|
360
|
+
throw new ConnectionError(result.message || 'Failed to connect to SFTP server', {
|
|
361
|
+
host: config.host,
|
|
362
|
+
port: config.port,
|
|
363
|
+
});
|
|
354
364
|
}
|
|
355
365
|
return await operation(client);
|
|
356
366
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telnet.d.ts","sourceRoot":"","sources":["../../src/protocols/telnet.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"telnet.d.ts","sourceRoot":"","sources":["../../src/protocols/telnet.ts"],"names":[],"mappings":"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"}
|
package/dist/protocols/telnet.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Socket } from 'node:net';
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { StateError, TimeoutError, ConnectionError } from '../core/errors.js';
|
|
3
4
|
const IAC = 255;
|
|
4
5
|
const CMD = {
|
|
5
6
|
SE: 240,
|
|
@@ -209,7 +210,10 @@ export class Telnet extends EventEmitter {
|
|
|
209
210
|
}
|
|
210
211
|
getSocket() {
|
|
211
212
|
if (!this.socket) {
|
|
212
|
-
throw new
|
|
213
|
+
throw new StateError('Not connected. Call connect() first.', {
|
|
214
|
+
expectedState: 'connected',
|
|
215
|
+
actualState: 'disconnected',
|
|
216
|
+
});
|
|
213
217
|
}
|
|
214
218
|
return this.socket;
|
|
215
219
|
}
|
|
@@ -414,7 +418,10 @@ export class Telnet extends EventEmitter {
|
|
|
414
418
|
return new Promise((resolve, reject) => {
|
|
415
419
|
const check = () => {
|
|
416
420
|
if (Date.now() - start > timeout) {
|
|
417
|
-
reject(new
|
|
421
|
+
reject(new TimeoutError(undefined, {
|
|
422
|
+
phase: 'response',
|
|
423
|
+
timeout,
|
|
424
|
+
}));
|
|
418
425
|
return;
|
|
419
426
|
}
|
|
420
427
|
if (this.matchPattern(this.dataBuffer, this.config.shellPrompt)) {
|
|
@@ -429,7 +436,10 @@ export class Telnet extends EventEmitter {
|
|
|
429
436
|
}
|
|
430
437
|
write(data) {
|
|
431
438
|
if (!this.socket || !this.connected) {
|
|
432
|
-
throw new
|
|
439
|
+
throw new StateError('Not connected', {
|
|
440
|
+
expectedState: 'connected',
|
|
441
|
+
actualState: 'disconnected',
|
|
442
|
+
});
|
|
433
443
|
}
|
|
434
444
|
const buffer = typeof data === 'string' ? Buffer.from(data) : data;
|
|
435
445
|
this.debug('Sending: %s', buffer.toString().replace(/\r\n/g, '\\r\\n'));
|
|
@@ -441,7 +451,10 @@ export class Telnet extends EventEmitter {
|
|
|
441
451
|
const startBuffer = this.dataBuffer;
|
|
442
452
|
const check = () => {
|
|
443
453
|
if (Date.now() - start > timeout) {
|
|
444
|
-
reject(new
|
|
454
|
+
reject(new TimeoutError(undefined, {
|
|
455
|
+
phase: 'response',
|
|
456
|
+
timeout,
|
|
457
|
+
}));
|
|
445
458
|
return;
|
|
446
459
|
}
|
|
447
460
|
if (this.matchPattern(this.dataBuffer, pattern)) {
|
|
@@ -479,7 +492,10 @@ export class Telnet extends EventEmitter {
|
|
|
479
492
|
}
|
|
480
493
|
ensureConnected() {
|
|
481
494
|
if (!this.connected || !this.socket) {
|
|
482
|
-
throw new
|
|
495
|
+
throw new StateError('Not connected to Telnet server. Call connect() first.', {
|
|
496
|
+
expectedState: 'connected',
|
|
497
|
+
actualState: 'disconnected',
|
|
498
|
+
});
|
|
483
499
|
}
|
|
484
500
|
}
|
|
485
501
|
cmdName(cmd) {
|
|
@@ -505,7 +521,10 @@ export async function telnet(config, operation) {
|
|
|
505
521
|
try {
|
|
506
522
|
const result = await client.connect();
|
|
507
523
|
if (!result.success) {
|
|
508
|
-
throw new
|
|
524
|
+
throw new ConnectionError(result.message || 'Failed to connect to Telnet server', {
|
|
525
|
+
host: config.host,
|
|
526
|
+
port: config.port,
|
|
527
|
+
});
|
|
509
528
|
}
|
|
510
529
|
return await operation(client);
|
|
511
530
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,CAQjE,CAAC;AAKF,8BAAsB,gBAAgB;IACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAEzC,OAAO,GAAE,uBAA4B;IAUjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,SAAS,CAAC,YAAY,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,KAAK,CAAC,MAAM;cAiBpD,aAAa,CAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAsClB,SAAS,CAAC,QAAQ,CAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAmFlB,SAAS,CAAC,cAAc,IAAI,UAAU;IAwCtC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;IAgBhE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAqB7E,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,CAQjE,CAAC;AAKF,8BAAsB,gBAAgB;IACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAEzC,OAAO,GAAE,uBAA4B;IAUjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,SAAS,CAAC,YAAY,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,KAAK,CAAC,MAAM;cAiBpD,aAAa,CAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAsClB,SAAS,CAAC,QAAQ,CAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAmFlB,SAAS,CAAC,cAAc,IAAI,UAAU;IAwCtC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;IAgBhE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAqB7E,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAehD,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import dgram from 'node:dgram';
|
|
2
2
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
-
import { TimeoutError, NetworkError } from '../core/errors.js';
|
|
3
|
+
import { TimeoutError, NetworkError, AbortError, ValidationError } from '../core/errors.js';
|
|
4
4
|
export const udpRequestStorage = new AsyncLocalStorage();
|
|
5
5
|
export const DEFAULT_UDP_OPTIONS = {
|
|
6
6
|
timeout: 5000,
|
|
@@ -36,7 +36,7 @@ export class BaseUDPTransport {
|
|
|
36
36
|
while (attempts < maxAttempts) {
|
|
37
37
|
try {
|
|
38
38
|
if (signal?.aborted) {
|
|
39
|
-
throw new
|
|
39
|
+
throw new AbortError('Request aborted');
|
|
40
40
|
}
|
|
41
41
|
const response = await this.sendOnce(socket, data, port, address, signal);
|
|
42
42
|
return response;
|
|
@@ -102,7 +102,7 @@ export class BaseUDPTransport {
|
|
|
102
102
|
return;
|
|
103
103
|
resolved = true;
|
|
104
104
|
cleanup();
|
|
105
|
-
reject(new
|
|
105
|
+
reject(new AbortError('Request aborted'));
|
|
106
106
|
}, { once: true });
|
|
107
107
|
}
|
|
108
108
|
socket.on('message', onMessage);
|
|
@@ -178,7 +178,10 @@ export class BaseUDPTransport {
|
|
|
178
178
|
}
|
|
179
179
|
validatePacketSize(data) {
|
|
180
180
|
if (data.length > this.options.maxPacketSize) {
|
|
181
|
-
throw new
|
|
181
|
+
throw new ValidationError(`Packet size ${data.length} exceeds maximum ${this.options.maxPacketSize} bytes`, {
|
|
182
|
+
field: 'packetSize',
|
|
183
|
+
value: data.length,
|
|
184
|
+
});
|
|
182
185
|
}
|
|
183
186
|
}
|
|
184
187
|
sleep(ms) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UnsupportedError, StreamError } from '../core/errors.js';
|
|
1
2
|
export class UDPResponseWrapper {
|
|
2
3
|
_buffer;
|
|
3
4
|
_timings;
|
|
@@ -92,7 +93,9 @@ export class UDPResponseWrapper {
|
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
95
|
async *sse() {
|
|
95
|
-
throw new
|
|
96
|
+
throw new UnsupportedError('SSE is not supported for UDP responses', {
|
|
97
|
+
feature: 'SSE',
|
|
98
|
+
});
|
|
96
99
|
}
|
|
97
100
|
async *download() {
|
|
98
101
|
yield {
|
|
@@ -160,7 +163,9 @@ export class StreamingUDPResponse {
|
|
|
160
163
|
}
|
|
161
164
|
pushPacket(packet) {
|
|
162
165
|
if (this._complete) {
|
|
163
|
-
throw new
|
|
166
|
+
throw new StreamError('Cannot push to completed stream', {
|
|
167
|
+
streamType: 'udp',
|
|
168
|
+
});
|
|
164
169
|
}
|
|
165
170
|
const waiter = this._waiters.shift();
|
|
166
171
|
if (waiter) {
|
|
@@ -227,7 +232,9 @@ export class StreamingUDPResponse {
|
|
|
227
232
|
return cloned;
|
|
228
233
|
}
|
|
229
234
|
async *sse() {
|
|
230
|
-
throw new
|
|
235
|
+
throw new UnsupportedError('SSE is not supported for UDP responses', {
|
|
236
|
+
feature: 'SSE',
|
|
237
|
+
});
|
|
231
238
|
}
|
|
232
239
|
async *download() {
|
|
233
240
|
let loaded = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;AA4CvF,qBAAa,SAAU,SAAQ,gBAAgB;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA0B;gBAErC,OAAO,GAAE,MAAW,EAAE,OAAO,GAAE,mBAAwB;IAuBnE,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,SAAS;IA0CjB,OAAO,CAAC,YAAY,CAAkB;IAKhC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA2FrD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B;AAsBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAEtE;AAKD,eAAO,MAAM,GAAG,EAAE,YAuGjB,CAAC;AAGF,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,CAAC"}
|
package/dist/transport/udp.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import dgram from 'node:dgram';
|
|
2
2
|
import { BaseUDPTransport, udpRequestStorage } from './base-udp.js';
|
|
3
3
|
import { UDPResponseWrapper } from './udp-response.js';
|
|
4
|
+
import { ValidationError } from '../core/errors.js';
|
|
4
5
|
const DEFAULT_OPTIONS = {
|
|
5
6
|
timeout: 5000,
|
|
6
7
|
retransmissions: 3,
|
|
@@ -84,7 +85,10 @@ export class UDPClient extends BaseUDPTransport {
|
|
|
84
85
|
const { host, port, path } = this.parseUrl(fullUrl);
|
|
85
86
|
this.log(`Dispatch to ${fullUrl}`);
|
|
86
87
|
if (!host || !port) {
|
|
87
|
-
throw new
|
|
88
|
+
throw new ValidationError(`Invalid UDP URL: ${fullUrl}. Expected format: udp://host:port/path`, {
|
|
89
|
+
field: 'url',
|
|
90
|
+
value: fullUrl,
|
|
91
|
+
});
|
|
88
92
|
}
|
|
89
93
|
let body;
|
|
90
94
|
if (req.body === null || req.body === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"undici.d.ts","sourceRoot":"","sources":["../../src/transport/undici.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAW,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAgB,UAAU,EAAkD,MAAM,mBAAmB,CAAC;AAOxN,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAwNzD,UAAU,sBAAsB;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqDD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAK;IAElC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAU;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAmG3D,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"undici.d.ts","sourceRoot":"","sources":["../../src/transport/undici.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAW,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAgB,UAAU,EAAkD,MAAM,mBAAmB,CAAC;AAOxN,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAwNzD,UAAU,sBAAsB;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqDD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAK;IAElC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAU;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAmG3D,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;YA+U7C,YAAY;CAoQ3B"}
|
package/dist/transport/undici.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { request as undiciRequest, errors as undiciErrors, ProxyAgent, Agent, Client } from 'undici';
|
|
2
2
|
import { HttpResponse } from '../core/response.js';
|
|
3
|
-
import { NetworkError, TimeoutError,
|
|
3
|
+
import { NetworkError, TimeoutError, MaxSizeExceededError } from '../core/errors.js';
|
|
4
4
|
import { performance } from 'perf_hooks';
|
|
5
5
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
6
6
|
import { channel } from 'node:diagnostics_channel';
|
|
@@ -447,11 +447,7 @@ export class UndiciTransport {
|
|
|
447
447
|
}
|
|
448
448
|
const code = error.code || error?.cause?.code;
|
|
449
449
|
if (code === 'UND_ERR_HEADERS_OVERFLOW') {
|
|
450
|
-
throw new
|
|
451
|
-
'Reduce response header size or adjust maxHeaderSize in agent configuration.',
|
|
452
|
-
'Check for runaway set-cookie or debug headers.',
|
|
453
|
-
'Verify upstream is not sending excessive headers.'
|
|
454
|
-
], false);
|
|
450
|
+
throw new MaxSizeExceededError(16 * 1024, undefined, req);
|
|
455
451
|
}
|
|
456
452
|
throw new NetworkError(error.message, code, req);
|
|
457
453
|
}
|
|
@@ -664,11 +660,7 @@ export class UndiciTransport {
|
|
|
664
660
|
}
|
|
665
661
|
const code = error.code || error?.cause?.code;
|
|
666
662
|
if (code === 'UND_ERR_HEADERS_OVERFLOW') {
|
|
667
|
-
throw new
|
|
668
|
-
'Reduce response header size or adjust maxHeaderSize in agent configuration.',
|
|
669
|
-
'Check for runaway set-cookie or debug headers.',
|
|
670
|
-
'Verify upstream is not sending excessive headers.'
|
|
671
|
-
], false);
|
|
663
|
+
throw new MaxSizeExceededError(16 * 1024, undefined, req);
|
|
672
664
|
}
|
|
673
665
|
throw new NetworkError(error.message, code, req);
|
|
674
666
|
}
|
|
@@ -14,6 +14,7 @@ export declare class AgentManager {
|
|
|
14
14
|
getAgentForDomain(domain: string, options?: Partial<AgentOptions>): Agent;
|
|
15
15
|
getAgentForUrl(url: string): Agent;
|
|
16
16
|
createBatchAgent(concurrency: number, requestCount: number, options?: Partial<AgentOptions>): Agent;
|
|
17
|
+
createStressTestAgent(concurrency: number): Agent;
|
|
17
18
|
private createAgent;
|
|
18
19
|
getStats(): AgentStats;
|
|
19
20
|
closeDomainAgent(domain: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/utils/agent-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAoJ;gBAEvJ,OAAO,GAAE,YAAiB;IAsBtC,cAAc,IAAI,KAAK;IAavB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK;IAkBzE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAmBlC,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,KAAK;
|
|
1
|
+
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/utils/agent-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAoJ;gBAEvJ,OAAO,GAAE,YAAiB;IAsBtC,cAAc,IAAI,KAAK;IAavB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK;IAkBzE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAmBlC,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,KAAK;IA4CR,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK;IAmBjD,OAAO,CAAC,WAAW;IAyBnB,QAAQ,IAAI,UAAU;IAWhB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B;AAOD,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,KAAK,CAG7D;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AASD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAcxD"}
|
|
@@ -61,6 +61,17 @@ export class AgentManager {
|
|
|
61
61
|
};
|
|
62
62
|
return this.createAgent(batchOptions);
|
|
63
63
|
}
|
|
64
|
+
createStressTestAgent(concurrency) {
|
|
65
|
+
const pipelining = 10;
|
|
66
|
+
const connections = Math.min(Math.ceil(concurrency / pipelining), 100);
|
|
67
|
+
return this.createAgent({
|
|
68
|
+
connections,
|
|
69
|
+
pipelining,
|
|
70
|
+
keepAliveTimeout: 30000,
|
|
71
|
+
keepAliveMaxTimeout: 120000,
|
|
72
|
+
connectTimeout: 5000,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
64
75
|
createAgent(options) {
|
|
65
76
|
return new Agent({
|
|
66
77
|
connections: options.connections,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-pool.d.ts","sourceRoot":"","sources":["../../src/utils/client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"client-pool.d.ts","sourceRoot":"","sources":["../../src/utils/client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAyB/D,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAM;IAQhE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiB5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,KAAK,IAAI,IAAI;IAOb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAmB1B,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,GACD,OAAO,CAAC,CAAC,EAAE,CAAC;CAgBhB;AAcD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAW3C,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,CAAM,GAAG,UAAU,CAK1G"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Client } from '../core/client.js';
|
|
2
|
+
import { UnsupportedError } from '../core/errors.js';
|
|
2
3
|
export class ClientPool {
|
|
3
4
|
pool = new Map();
|
|
4
5
|
defaultOptions;
|
|
@@ -33,7 +34,9 @@ export class ClientPool {
|
|
|
33
34
|
const client = this.get(baseUrl);
|
|
34
35
|
const methodFn = client[method.toLowerCase()];
|
|
35
36
|
if (typeof methodFn !== 'function') {
|
|
36
|
-
throw new
|
|
37
|
+
throw new UnsupportedError(`Unknown HTTP method: ${method}`, {
|
|
38
|
+
feature: method,
|
|
39
|
+
});
|
|
37
40
|
}
|
|
38
41
|
return methodFn.call(client, path, options).json();
|
|
39
42
|
});
|