recker 1.0.15 → 1.0.17-next.9570ed5
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 +86 -97
- 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 +8 -3
- package/dist/bench/stats.d.ts +15 -1
- package/dist/bench/stats.d.ts.map +1 -1
- package/dist/bench/stats.js +117 -5
- 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 +602 -48
- 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 +127 -32
- package/dist/cli/tui/scroll-buffer.d.ts +43 -0
- package/dist/cli/tui/scroll-buffer.d.ts.map +1 -0
- package/dist/cli/tui/scroll-buffer.js +162 -0
- package/dist/cli/tui/search-panel.d.ts +41 -0
- package/dist/cli/tui/search-panel.d.ts.map +1 -0
- package/dist/cli/tui/search-panel.js +420 -0
- package/dist/cli/tui/shell.d.ts +14 -0
- package/dist/cli/tui/shell.d.ts.map +1 -1
- package/dist/cli/tui/shell.js +424 -46
- package/dist/cli/tui/websocket.js +17 -17
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +3 -2
- 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/index.d.ts +1 -0
- package/dist/dns/index.d.ts.map +1 -1
- package/dist/dns/index.js +1 -0
- package/dist/dns/propagation.d.ts +21 -0
- package/dist/dns/propagation.d.ts.map +1 -0
- package/dist/dns/propagation.js +169 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +10 -11
- package/dist/mcp/embeddings-loader.d.ts +18 -0
- package/dist/mcp/embeddings-loader.d.ts.map +1 -0
- package/dist/mcp/embeddings-loader.js +162 -0
- 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/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -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 +59 -38
- package/dist/mcp/search/math.d.ts.map +1 -1
- package/dist/mcp/search/math.js +5 -1
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +122 -2
- 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/presets/index.d.ts +2 -0
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +2 -0
- package/dist/presets/mailgun.d.ts +8 -0
- package/dist/presets/mailgun.d.ts.map +1 -0
- package/dist/presets/mailgun.js +20 -0
- package/dist/presets/registry.d.ts.map +1 -1
- package/dist/presets/registry.js +20 -0
- package/dist/presets/sinch.d.ts +10 -0
- package/dist/presets/sinch.d.ts.map +1 -0
- package/dist/presets/sinch.js +39 -0
- 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/recker.d.ts +47 -0
- package/dist/recker.d.ts.map +1 -0
- package/dist/recker.js +99 -0
- 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 +75 -63
- 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/colors.d.ts +16 -0
- package/dist/utils/colors.d.ts.map +1 -1
- package/dist/utils/colors.js +16 -0
- 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 +47 -0
- package/dist/utils/security-grader.d.ts.map +1 -0
- package/dist/utils/security-grader.js +637 -0
- 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/utils/tls-inspector.d.ts +6 -0
- package/dist/utils/tls-inspector.d.ts.map +1 -1
- package/dist/utils/tls-inspector.js +35 -1
- 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 +4 -3
- package/dist/mcp/data/embeddings.json +0 -1
package/dist/recker.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createClient } from './core/client.js';
|
|
2
|
+
import { FetchTransport } from './transport/fetch.js';
|
|
3
|
+
import { createWebSocket } from './websocket/client.js';
|
|
4
|
+
import { whois as whoisLookup, isDomainAvailable, createWhois } from './utils/whois.js';
|
|
5
|
+
import { createDNS } from './dns/index.js';
|
|
6
|
+
import { createAI } from './ai/index.js';
|
|
7
|
+
let _defaultClient = null;
|
|
8
|
+
let _defaultDns = null;
|
|
9
|
+
let _defaultAi = null;
|
|
10
|
+
function getDefaultClient() {
|
|
11
|
+
if (!_defaultClient) {
|
|
12
|
+
_defaultClient = createClient({
|
|
13
|
+
transport: new FetchTransport(),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return _defaultClient;
|
|
17
|
+
}
|
|
18
|
+
function getDefaultDns() {
|
|
19
|
+
if (!_defaultDns) {
|
|
20
|
+
_defaultDns = createDNS();
|
|
21
|
+
}
|
|
22
|
+
return _defaultDns;
|
|
23
|
+
}
|
|
24
|
+
function getDefaultAi() {
|
|
25
|
+
if (!_defaultAi) {
|
|
26
|
+
_defaultAi = createAI();
|
|
27
|
+
}
|
|
28
|
+
return _defaultAi;
|
|
29
|
+
}
|
|
30
|
+
export function get(url, options) {
|
|
31
|
+
return getDefaultClient().get(url, options);
|
|
32
|
+
}
|
|
33
|
+
export function post(url, options) {
|
|
34
|
+
return getDefaultClient().post(url, options);
|
|
35
|
+
}
|
|
36
|
+
export function put(url, options) {
|
|
37
|
+
return getDefaultClient().put(url, options);
|
|
38
|
+
}
|
|
39
|
+
export function patch(url, options) {
|
|
40
|
+
return getDefaultClient().patch(url, options);
|
|
41
|
+
}
|
|
42
|
+
export function del(url, options) {
|
|
43
|
+
return getDefaultClient().delete(url, options);
|
|
44
|
+
}
|
|
45
|
+
export function head(url, options) {
|
|
46
|
+
return getDefaultClient().head(url, options);
|
|
47
|
+
}
|
|
48
|
+
export function options(url, options) {
|
|
49
|
+
return getDefaultClient().options(url, options);
|
|
50
|
+
}
|
|
51
|
+
export async function whois(query, options) {
|
|
52
|
+
return whoisLookup(query, options);
|
|
53
|
+
}
|
|
54
|
+
export async function whoisAvailable(domain) {
|
|
55
|
+
return isDomainAvailable(domain);
|
|
56
|
+
}
|
|
57
|
+
export async function dns(hostname, type = 'A') {
|
|
58
|
+
return getDefaultDns().resolve(hostname, type);
|
|
59
|
+
}
|
|
60
|
+
export async function dnsSecurity(domain) {
|
|
61
|
+
return getDefaultDns().getSecurityRecords(domain);
|
|
62
|
+
}
|
|
63
|
+
export function ws(url, options) {
|
|
64
|
+
return createWebSocket(url, options);
|
|
65
|
+
}
|
|
66
|
+
const aiNamespace = {
|
|
67
|
+
chat: (...args) => getDefaultAi().chat(...args),
|
|
68
|
+
stream: (...args) => getDefaultAi().stream(...args),
|
|
69
|
+
embed: (...args) => getDefaultAi().embed(...args),
|
|
70
|
+
extend: (...args) => getDefaultAi().extend(...args),
|
|
71
|
+
get metrics() {
|
|
72
|
+
return getDefaultAi().metrics;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
export const recker = {
|
|
76
|
+
get,
|
|
77
|
+
post,
|
|
78
|
+
put,
|
|
79
|
+
patch,
|
|
80
|
+
delete: del,
|
|
81
|
+
head,
|
|
82
|
+
options,
|
|
83
|
+
whois,
|
|
84
|
+
whoisAvailable,
|
|
85
|
+
dns,
|
|
86
|
+
dnsSecurity,
|
|
87
|
+
ws,
|
|
88
|
+
ai: aiNamespace,
|
|
89
|
+
client: (options) => createClient(options),
|
|
90
|
+
dnsClient: (options) => createDNS(options),
|
|
91
|
+
whoisClient: createWhois,
|
|
92
|
+
aiClient: (options) => createAI(options),
|
|
93
|
+
reset: () => {
|
|
94
|
+
_defaultClient = null;
|
|
95
|
+
_defaultDns = null;
|
|
96
|
+
_defaultAi = null;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
export default recker;
|
|
@@ -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';
|
|
@@ -303,7 +303,7 @@ export class UndiciTransport {
|
|
|
303
303
|
connectTimeout: timeouts.connectTimeout,
|
|
304
304
|
headersTimeout: timeouts.headersTimeout,
|
|
305
305
|
bodyTimeout: timeouts.bodyTimeout,
|
|
306
|
-
maxRedirections:
|
|
306
|
+
maxRedirections: 0,
|
|
307
307
|
};
|
|
308
308
|
if (finalBody && (finalBody instanceof ReadableStream ||
|
|
309
309
|
(typeof finalBody.pipe === 'function') ||
|
|
@@ -347,39 +347,49 @@ export class UndiciTransport {
|
|
|
347
347
|
}
|
|
348
348
|
const statusCode = undiciResponse.statusCode;
|
|
349
349
|
const isRedirect = statusCode >= 300 && statusCode < 400;
|
|
350
|
-
if (
|
|
350
|
+
if (isRedirect && followRedirects && redirectCount < maxRedirects) {
|
|
351
351
|
const locationHeader = undiciResponse.headers['location'];
|
|
352
352
|
const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader;
|
|
353
353
|
if (location) {
|
|
354
354
|
const nextUrl = new URL(location, currentUrl).toString();
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
if (
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
355
|
+
if (handleRedirectsManually) {
|
|
356
|
+
const responseHeaders = new Headers();
|
|
357
|
+
for (const [key, value] of Object.entries(undiciResponse.headers)) {
|
|
358
|
+
if (value !== undefined) {
|
|
359
|
+
if (Array.isArray(value)) {
|
|
360
|
+
value.forEach(v => responseHeaders.append(key, v));
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
responseHeaders.set(key, value);
|
|
364
|
+
}
|
|
363
365
|
}
|
|
364
366
|
}
|
|
367
|
+
const redirectInfo = {
|
|
368
|
+
from: currentUrl,
|
|
369
|
+
to: nextUrl,
|
|
370
|
+
status: statusCode,
|
|
371
|
+
headers: responseHeaders,
|
|
372
|
+
};
|
|
373
|
+
const hookResult = await req.beforeRedirect(redirectInfo);
|
|
374
|
+
if (hookResult === false) {
|
|
375
|
+
const finalResponse = req.onDownloadProgress
|
|
376
|
+
? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
|
|
377
|
+
: undiciResponse;
|
|
378
|
+
return new HttpResponse(finalResponse, {
|
|
379
|
+
timings: requestContext.timings,
|
|
380
|
+
connection: requestContext.connection
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (typeof hookResult === 'string') {
|
|
384
|
+
currentUrl = hookResult;
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
currentUrl = nextUrl;
|
|
388
|
+
}
|
|
365
389
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
to: nextUrl,
|
|
369
|
-
status: statusCode,
|
|
370
|
-
headers: responseHeaders,
|
|
371
|
-
};
|
|
372
|
-
const hookResult = await req.beforeRedirect(redirectInfo);
|
|
373
|
-
if (hookResult === false) {
|
|
374
|
-
const finalResponse = req.onDownloadProgress
|
|
375
|
-
? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
|
|
376
|
-
: undiciResponse;
|
|
377
|
-
return new HttpResponse(finalResponse, {
|
|
378
|
-
timings: requestContext.timings,
|
|
379
|
-
connection: requestContext.connection
|
|
380
|
-
});
|
|
390
|
+
else {
|
|
391
|
+
currentUrl = nextUrl;
|
|
381
392
|
}
|
|
382
|
-
currentUrl = typeof hookResult === 'string' ? hookResult : nextUrl;
|
|
383
393
|
if (statusCode === 303 || ((statusCode === 301 || statusCode === 302) && currentMethod !== 'GET' && currentMethod !== 'HEAD')) {
|
|
384
394
|
currentMethod = 'GET';
|
|
385
395
|
currentBody = null;
|
|
@@ -437,11 +447,7 @@ export class UndiciTransport {
|
|
|
437
447
|
}
|
|
438
448
|
const code = error.code || error?.cause?.code;
|
|
439
449
|
if (code === 'UND_ERR_HEADERS_OVERFLOW') {
|
|
440
|
-
throw new
|
|
441
|
-
'Reduce response header size or adjust maxHeaderSize in agent configuration.',
|
|
442
|
-
'Check for runaway set-cookie or debug headers.',
|
|
443
|
-
'Verify upstream is not sending excessive headers.'
|
|
444
|
-
], false);
|
|
450
|
+
throw new MaxSizeExceededError(16 * 1024, undefined, req);
|
|
445
451
|
}
|
|
446
452
|
throw new NetworkError(error.message, code, req);
|
|
447
453
|
}
|
|
@@ -518,7 +524,7 @@ export class UndiciTransport {
|
|
|
518
524
|
connectTimeout: timeouts.connectTimeout,
|
|
519
525
|
headersTimeout: timeouts.headersTimeout,
|
|
520
526
|
bodyTimeout: timeouts.bodyTimeout,
|
|
521
|
-
maxRedirections:
|
|
527
|
+
maxRedirections: 0,
|
|
522
528
|
};
|
|
523
529
|
if (finalBody && (finalBody instanceof ReadableStream ||
|
|
524
530
|
(typeof finalBody.pipe === 'function') ||
|
|
@@ -562,39 +568,49 @@ export class UndiciTransport {
|
|
|
562
568
|
}
|
|
563
569
|
const statusCode = undiciResponse.statusCode;
|
|
564
570
|
const isRedirect = statusCode >= 300 && statusCode < 400;
|
|
565
|
-
if (
|
|
571
|
+
if (isRedirect && followRedirects && redirectCount < maxRedirects) {
|
|
566
572
|
const locationHeader = undiciResponse.headers['location'];
|
|
567
573
|
const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader;
|
|
568
574
|
if (location) {
|
|
569
575
|
const nextUrl = new URL(location, currentUrl).toString();
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
if (
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
576
|
+
if (handleRedirectsManually) {
|
|
577
|
+
const responseHeaders = new Headers();
|
|
578
|
+
for (const [key, value] of Object.entries(undiciResponse.headers)) {
|
|
579
|
+
if (value !== undefined) {
|
|
580
|
+
if (Array.isArray(value)) {
|
|
581
|
+
value.forEach(v => responseHeaders.append(key, v));
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
responseHeaders.set(key, value);
|
|
585
|
+
}
|
|
578
586
|
}
|
|
579
587
|
}
|
|
588
|
+
const redirectInfo = {
|
|
589
|
+
from: currentUrl,
|
|
590
|
+
to: nextUrl,
|
|
591
|
+
status: statusCode,
|
|
592
|
+
headers: responseHeaders,
|
|
593
|
+
};
|
|
594
|
+
const hookResult = await req.beforeRedirect(redirectInfo);
|
|
595
|
+
if (hookResult === false) {
|
|
596
|
+
const finalResponse = req.onDownloadProgress
|
|
597
|
+
? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
|
|
598
|
+
: undiciResponse;
|
|
599
|
+
return new HttpResponse(finalResponse, {
|
|
600
|
+
timings: {},
|
|
601
|
+
connection: {}
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
if (typeof hookResult === 'string') {
|
|
605
|
+
currentUrl = hookResult;
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
currentUrl = nextUrl;
|
|
609
|
+
}
|
|
580
610
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
to: nextUrl,
|
|
584
|
-
status: statusCode,
|
|
585
|
-
headers: responseHeaders,
|
|
586
|
-
};
|
|
587
|
-
const hookResult = await req.beforeRedirect(redirectInfo);
|
|
588
|
-
if (hookResult === false) {
|
|
589
|
-
const finalResponse = req.onDownloadProgress
|
|
590
|
-
? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
|
|
591
|
-
: undiciResponse;
|
|
592
|
-
return new HttpResponse(finalResponse, {
|
|
593
|
-
timings: {},
|
|
594
|
-
connection: {}
|
|
595
|
-
});
|
|
611
|
+
else {
|
|
612
|
+
currentUrl = nextUrl;
|
|
596
613
|
}
|
|
597
|
-
currentUrl = typeof hookResult === 'string' ? hookResult : nextUrl;
|
|
598
614
|
if (statusCode === 303 || ((statusCode === 301 || statusCode === 302) && currentMethod !== 'GET' && currentMethod !== 'HEAD')) {
|
|
599
615
|
currentMethod = 'GET';
|
|
600
616
|
currentBody = null;
|
|
@@ -644,11 +660,7 @@ export class UndiciTransport {
|
|
|
644
660
|
}
|
|
645
661
|
const code = error.code || error?.cause?.code;
|
|
646
662
|
if (code === 'UND_ERR_HEADERS_OVERFLOW') {
|
|
647
|
-
throw new
|
|
648
|
-
'Reduce response header size or adjust maxHeaderSize in agent configuration.',
|
|
649
|
-
'Check for runaway set-cookie or debug headers.',
|
|
650
|
-
'Verify upstream is not sending excessive headers.'
|
|
651
|
-
], false);
|
|
663
|
+
throw new MaxSizeExceededError(16 * 1024, undefined, req);
|
|
652
664
|
}
|
|
653
665
|
throw new NetworkError(error.message, code, req);
|
|
654
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
|
});
|
package/dist/utils/colors.d.ts
CHANGED
|
@@ -9,6 +9,14 @@ export declare const magenta: (s: string | number) => string;
|
|
|
9
9
|
export declare const cyan: (s: string | number) => string;
|
|
10
10
|
export declare const white: (s: string | number) => string;
|
|
11
11
|
export declare const gray: (s: string | number) => string;
|
|
12
|
+
export declare const bgBlack: (s: string | number) => string;
|
|
13
|
+
export declare const bgRed: (s: string | number) => string;
|
|
14
|
+
export declare const bgGreen: (s: string | number) => string;
|
|
15
|
+
export declare const bgYellow: (s: string | number) => string;
|
|
16
|
+
export declare const bgBlue: (s: string | number) => string;
|
|
17
|
+
export declare const bgMagenta: (s: string | number) => string;
|
|
18
|
+
export declare const bgCyan: (s: string | number) => string;
|
|
19
|
+
export declare const bgWhite: (s: string | number) => string;
|
|
12
20
|
declare const colors: {
|
|
13
21
|
reset: (s: string) => string;
|
|
14
22
|
bold: (s: string | number) => string;
|
|
@@ -21,6 +29,14 @@ declare const colors: {
|
|
|
21
29
|
cyan: (s: string | number) => string;
|
|
22
30
|
white: (s: string | number) => string;
|
|
23
31
|
gray: (s: string | number) => string;
|
|
32
|
+
bgBlack: (s: string | number) => string;
|
|
33
|
+
bgRed: (s: string | number) => string;
|
|
34
|
+
bgGreen: (s: string | number) => string;
|
|
35
|
+
bgYellow: (s: string | number) => string;
|
|
36
|
+
bgBlue: (s: string | number) => string;
|
|
37
|
+
bgMagenta: (s: string | number) => string;
|
|
38
|
+
bgCyan: (s: string | number) => string;
|
|
39
|
+
bgWhite: (s: string | number) => string;
|
|
24
40
|
grey: (s: string | number) => string;
|
|
25
41
|
};
|
|
26
42
|
export default colors;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AA6CA,eAAO,MAAM,KAAK,MAAmB,MAAM,WAA4C,CAAC;AACxF,eAAO,MAAM,IAAI,MAfY,MAAM,GAAG,MAAM,WAeb,CAAC;AAGhC,eAAO,MAAM,KAAK,MAlBW,MAAM,GAAG,MAAM,WAkBX,CAAC;AAClC,eAAO,MAAM,GAAG,MAnBa,MAAM,GAAG,MAAM,WAmBb,CAAC;AAChC,eAAO,MAAM,KAAK,MApBW,MAAM,GAAG,MAAM,WAoBX,CAAC;AAClC,eAAO,MAAM,MAAM,MArBU,MAAM,GAAG,MAAM,WAqBV,CAAC;AACnC,eAAO,MAAM,IAAI,MAtBY,MAAM,GAAG,MAAM,WAsBZ,CAAC;AACjC,eAAO,MAAM,OAAO,MAvBS,MAAM,GAAG,MAAM,WAuBT,CAAC;AACpC,eAAO,MAAM,IAAI,MAxBY,MAAM,GAAG,MAAM,WAwBZ,CAAC;AACjC,eAAO,MAAM,KAAK,MAzBW,MAAM,GAAG,MAAM,WAyBX,CAAC;AAClC,eAAO,MAAM,IAAI,MA1BY,MAAM,GAAG,MAAM,WA0BZ,CAAC;AAGjC,QAAA,MAAM,MAAM;
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/utils/colors.ts"],"names":[],"mappings":"AA6CA,eAAO,MAAM,KAAK,MAAmB,MAAM,WAA4C,CAAC;AACxF,eAAO,MAAM,IAAI,MAfY,MAAM,GAAG,MAAM,WAeb,CAAC;AAGhC,eAAO,MAAM,KAAK,MAlBW,MAAM,GAAG,MAAM,WAkBX,CAAC;AAClC,eAAO,MAAM,GAAG,MAnBa,MAAM,GAAG,MAAM,WAmBb,CAAC;AAChC,eAAO,MAAM,KAAK,MApBW,MAAM,GAAG,MAAM,WAoBX,CAAC;AAClC,eAAO,MAAM,MAAM,MArBU,MAAM,GAAG,MAAM,WAqBV,CAAC;AACnC,eAAO,MAAM,IAAI,MAtBY,MAAM,GAAG,MAAM,WAsBZ,CAAC;AACjC,eAAO,MAAM,OAAO,MAvBS,MAAM,GAAG,MAAM,WAuBT,CAAC;AACpC,eAAO,MAAM,IAAI,MAxBY,MAAM,GAAG,MAAM,WAwBZ,CAAC;AACjC,eAAO,MAAM,KAAK,MAzBW,MAAM,GAAG,MAAM,WAyBX,CAAC;AAClC,eAAO,MAAM,IAAI,MA1BY,MAAM,GAAG,MAAM,WA0BZ,CAAC;AAGjC,eAAO,MAAM,OAAO,MA7BS,MAAM,GAAG,MAAM,WA6BT,CAAC;AACpC,eAAO,MAAM,KAAK,MA9BW,MAAM,GAAG,MAAM,WA8BX,CAAC;AAClC,eAAO,MAAM,OAAO,MA/BS,MAAM,GAAG,MAAM,WA+BT,CAAC;AACpC,eAAO,MAAM,QAAQ,MAhCQ,MAAM,GAAG,MAAM,WAgCR,CAAC;AACrC,eAAO,MAAM,MAAM,MAjCU,MAAM,GAAG,MAAM,WAiCV,CAAC;AACnC,eAAO,MAAM,SAAS,MAlCO,MAAM,GAAG,MAAM,WAkCP,CAAC;AACtC,eAAO,MAAM,MAAM,MAnCU,MAAM,GAAG,MAAM,WAmCV,CAAC;AACnC,eAAO,MAAM,OAAO,MApCS,MAAM,GAAG,MAAM,WAoCT,CAAC;AAGpC,QAAA,MAAM,MAAM;eAzByB,MAAM;cAdd,MAAM,GAAG,MAAM;eAAf,MAAM,GAAG,MAAM;aAAf,MAAM,GAAG,MAAM;eAAf,MAAM,GAAG,MAAM;gBAAf,MAAM,GAAG,MAAM;cAAf,MAAM,GAAG,MAAM;iBAAf,MAAM,GAAG,MAAM;cAAf,MAAM,GAAG,MAAM;eAAf,MAAM,GAAG,MAAM;cAAf,MAAM,GAAG,MAAM;iBAAf,MAAM,GAAG,MAAM;eAAf,MAAM,GAAG,MAAM;iBAAf,MAAM,GAAG,MAAM;kBAAf,MAAM,GAAG,MAAM;gBAAf,MAAM,GAAG,MAAM;mBAAf,MAAM,GAAG,MAAM;gBAAf,MAAM,GAAG,MAAM;iBAAf,MAAM,GAAG,MAAM;cAAf,MAAM,GAAG,MAAM;CA8D3C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/utils/colors.js
CHANGED
|
@@ -33,6 +33,14 @@ export const magenta = code(35, 39);
|
|
|
33
33
|
export const cyan = code(36, 39);
|
|
34
34
|
export const white = code(37, 39);
|
|
35
35
|
export const gray = code(90, 39);
|
|
36
|
+
export const bgBlack = code(40, 49);
|
|
37
|
+
export const bgRed = code(41, 49);
|
|
38
|
+
export const bgGreen = code(42, 49);
|
|
39
|
+
export const bgYellow = code(43, 49);
|
|
40
|
+
export const bgBlue = code(44, 49);
|
|
41
|
+
export const bgMagenta = code(45, 49);
|
|
42
|
+
export const bgCyan = code(46, 49);
|
|
43
|
+
export const bgWhite = code(47, 49);
|
|
36
44
|
const colors = {
|
|
37
45
|
reset,
|
|
38
46
|
bold,
|
|
@@ -45,6 +53,14 @@ const colors = {
|
|
|
45
53
|
cyan,
|
|
46
54
|
white,
|
|
47
55
|
gray,
|
|
56
|
+
bgBlack,
|
|
57
|
+
bgRed,
|
|
58
|
+
bgGreen,
|
|
59
|
+
bgYellow,
|
|
60
|
+
bgBlue,
|
|
61
|
+
bgMagenta,
|
|
62
|
+
bgCyan,
|
|
63
|
+
bgWhite,
|
|
48
64
|
grey: gray,
|
|
49
65
|
};
|
|
50
66
|
export default colors;
|