monitor-transfer-dsh 0.0.0-stage → 0.1.2
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/CHANGELOG.md +25 -0
- package/README.md +51 -2
- package/cordis.patch.yml +4 -0
- package/lib/client.js +381 -0
- package/lib/index.js +267 -0
- package/package.json +67 -3
- package/skill/SKILL.md +48 -0
- package/skill/tools/node_modules/.package-lock.json +163 -0
- package/skill/tools/node_modules/pg/LICENSE +21 -0
- package/skill/tools/node_modules/pg/README.md +96 -0
- package/skill/tools/node_modules/pg/esm/index.mjs +20 -0
- package/skill/tools/node_modules/pg/lib/client.js +846 -0
- package/skill/tools/node_modules/pg/lib/connection-parameters.js +184 -0
- package/skill/tools/node_modules/pg/lib/connection.js +250 -0
- package/skill/tools/node_modules/pg/lib/crypto/cert-signatures.js +122 -0
- package/skill/tools/node_modules/pg/lib/crypto/sasl.js +262 -0
- package/skill/tools/node_modules/pg/lib/crypto/utils.js +89 -0
- package/skill/tools/node_modules/pg/lib/defaults.js +94 -0
- package/skill/tools/node_modules/pg/lib/index.js +73 -0
- package/skill/tools/node_modules/pg/lib/native/client.js +428 -0
- package/skill/tools/node_modules/pg/lib/native/index.js +2 -0
- package/skill/tools/node_modules/pg/lib/native/query.js +167 -0
- package/skill/tools/node_modules/pg/lib/query.js +263 -0
- package/skill/tools/node_modules/pg/lib/result.js +109 -0
- package/skill/tools/node_modules/pg/lib/stream.js +83 -0
- package/skill/tools/node_modules/pg/lib/type-overrides.js +35 -0
- package/skill/tools/node_modules/pg/lib/utils.js +225 -0
- package/skill/tools/node_modules/pg/package.json +76 -0
- package/skill/tools/node_modules/pg-cloudflare/LICENSE +21 -0
- package/skill/tools/node_modules/pg-cloudflare/README.md +112 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/empty.d.ts +2 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/empty.js +6 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/empty.js.map +1 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/index.d.ts +29 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/index.js +171 -0
- package/skill/tools/node_modules/pg-cloudflare/dist/index.js.map +1 -0
- package/skill/tools/node_modules/pg-cloudflare/esm/index.mjs +3 -0
- package/skill/tools/node_modules/pg-cloudflare/package.json +39 -0
- package/skill/tools/node_modules/pg-cloudflare/src/empty.ts +3 -0
- package/skill/tools/node_modules/pg-cloudflare/src/index.ts +187 -0
- package/skill/tools/node_modules/pg-cloudflare/src/types.d.ts +25 -0
- package/skill/tools/node_modules/pg-connection-string/LICENSE +21 -0
- package/skill/tools/node_modules/pg-connection-string/README.md +105 -0
- package/skill/tools/node_modules/pg-connection-string/esm/index.mjs +8 -0
- package/skill/tools/node_modules/pg-connection-string/index.d.ts +37 -0
- package/skill/tools/node_modules/pg-connection-string/index.js +237 -0
- package/skill/tools/node_modules/pg-connection-string/package.json +51 -0
- package/skill/tools/node_modules/pg-int8/LICENSE +13 -0
- package/skill/tools/node_modules/pg-int8/README.md +16 -0
- package/skill/tools/node_modules/pg-int8/index.js +100 -0
- package/skill/tools/node_modules/pg-int8/package.json +24 -0
- package/skill/tools/node_modules/pg-pool/LICENSE +21 -0
- package/skill/tools/node_modules/pg-pool/README.md +357 -0
- package/skill/tools/node_modules/pg-pool/esm/index.mjs +5 -0
- package/skill/tools/node_modules/pg-pool/index.js +517 -0
- package/skill/tools/node_modules/pg-pool/package.json +51 -0
- package/skill/tools/node_modules/pg-protocol/LICENSE +21 -0
- package/skill/tools/node_modules/pg-protocol/README.md +3 -0
- package/skill/tools/node_modules/pg-protocol/dist/b.d.ts +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/b.js +23 -0
- package/skill/tools/node_modules/pg-protocol/dist/b.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-reader.d.ts +14 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-reader.js +55 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-reader.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-writer.d.ts +21 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-writer.js +113 -0
- package/skill/tools/node_modules/pg-protocol/dist/buffer-writer.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/inbound-parser.test.d.ts +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/inbound-parser.test.js +538 -0
- package/skill/tools/node_modules/pg-protocol/dist/inbound-parser.test.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/index.d.ts +5 -0
- package/skill/tools/node_modules/pg-protocol/dist/index.js +15 -0
- package/skill/tools/node_modules/pg-protocol/dist/index.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/messages.d.ts +161 -0
- package/skill/tools/node_modules/pg-protocol/dist/messages.js +160 -0
- package/skill/tools/node_modules/pg-protocol/dist/messages.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/outbound-serializer.test.js +325 -0
- package/skill/tools/node_modules/pg-protocol/dist/outbound-serializer.test.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/parser.d.ts +22 -0
- package/skill/tools/node_modules/pg-protocol/dist/parser.js +325 -0
- package/skill/tools/node_modules/pg-protocol/dist/parser.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/dist/serializer.d.ts +42 -0
- package/skill/tools/node_modules/pg-protocol/dist/serializer.js +198 -0
- package/skill/tools/node_modules/pg-protocol/dist/serializer.js.map +1 -0
- package/skill/tools/node_modules/pg-protocol/esm/index.js +11 -0
- package/skill/tools/node_modules/pg-protocol/package.json +44 -0
- package/skill/tools/node_modules/pg-protocol/src/b.ts +25 -0
- package/skill/tools/node_modules/pg-protocol/src/buffer-reader.ts +58 -0
- package/skill/tools/node_modules/pg-protocol/src/buffer-writer.ts +120 -0
- package/skill/tools/node_modules/pg-protocol/src/inbound-parser.test.ts +585 -0
- package/skill/tools/node_modules/pg-protocol/src/index.ts +11 -0
- package/skill/tools/node_modules/pg-protocol/src/messages.ts +262 -0
- package/skill/tools/node_modules/pg-protocol/src/outbound-serializer.test.ts +356 -0
- package/skill/tools/node_modules/pg-protocol/src/parser.ts +414 -0
- package/skill/tools/node_modules/pg-protocol/src/serializer.ts +286 -0
- package/skill/tools/node_modules/pg-protocol/src/testing/buffer-list.ts +67 -0
- package/skill/tools/node_modules/pg-protocol/src/testing/test-buffers.ts +166 -0
- package/skill/tools/node_modules/pg-types/.travis.yml +7 -0
- package/skill/tools/node_modules/pg-types/Makefile +14 -0
- package/skill/tools/node_modules/pg-types/README.md +75 -0
- package/skill/tools/node_modules/pg-types/index.d.ts +137 -0
- package/skill/tools/node_modules/pg-types/index.js +47 -0
- package/skill/tools/node_modules/pg-types/index.test-d.ts +21 -0
- package/skill/tools/node_modules/pg-types/lib/arrayParser.js +11 -0
- package/skill/tools/node_modules/pg-types/lib/binaryParsers.js +257 -0
- package/skill/tools/node_modules/pg-types/lib/builtins.js +73 -0
- package/skill/tools/node_modules/pg-types/lib/textParsers.js +215 -0
- package/skill/tools/node_modules/pg-types/package.json +42 -0
- package/skill/tools/node_modules/pg-types/test/index.js +24 -0
- package/skill/tools/node_modules/pg-types/test/types.js +597 -0
- package/skill/tools/node_modules/pgpass/README.md +74 -0
- package/skill/tools/node_modules/pgpass/lib/helper.js +233 -0
- package/skill/tools/node_modules/pgpass/lib/index.js +23 -0
- package/skill/tools/node_modules/pgpass/package.json +41 -0
- package/skill/tools/node_modules/postgres-array/index.d.ts +4 -0
- package/skill/tools/node_modules/postgres-array/index.js +97 -0
- package/skill/tools/node_modules/postgres-array/license +21 -0
- package/skill/tools/node_modules/postgres-array/package.json +35 -0
- package/skill/tools/node_modules/postgres-array/readme.md +43 -0
- package/skill/tools/node_modules/postgres-bytea/index.js +33 -0
- package/skill/tools/node_modules/postgres-bytea/license +21 -0
- package/skill/tools/node_modules/postgres-bytea/package.json +34 -0
- package/skill/tools/node_modules/postgres-bytea/readme.md +34 -0
- package/skill/tools/node_modules/postgres-date/index.js +116 -0
- package/skill/tools/node_modules/postgres-date/license +21 -0
- package/skill/tools/node_modules/postgres-date/package.json +33 -0
- package/skill/tools/node_modules/postgres-date/readme.md +49 -0
- package/skill/tools/node_modules/postgres-interval/index.d.ts +20 -0
- package/skill/tools/node_modules/postgres-interval/index.js +125 -0
- package/skill/tools/node_modules/postgres-interval/license +21 -0
- package/skill/tools/node_modules/postgres-interval/package.json +36 -0
- package/skill/tools/node_modules/postgres-interval/readme.md +48 -0
- package/skill/tools/node_modules/split2/LICENSE +13 -0
- package/skill/tools/node_modules/split2/README.md +85 -0
- package/skill/tools/node_modules/split2/bench.js +27 -0
- package/skill/tools/node_modules/split2/index.js +141 -0
- package/skill/tools/node_modules/split2/package.json +39 -0
- package/skill/tools/node_modules/split2/test.js +409 -0
- package/skill/tools/node_modules/undici/LICENSE +21 -0
- package/skill/tools/node_modules/undici/README.md +828 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Agent.md +291 -0
- package/skill/tools/node_modules/undici/docs/docs/api/BalancedPool.md +297 -0
- package/skill/tools/node_modules/undici/docs/docs/api/CacheStorage.md +188 -0
- package/skill/tools/node_modules/undici/docs/docs/api/CacheStore.md +375 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Client.md +538 -0
- package/skill/tools/node_modules/undici/docs/docs/api/ClientStats.md +93 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Connector.md +198 -0
- package/skill/tools/node_modules/undici/docs/docs/api/ContentType.md +97 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Cookies.md +179 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Debug.md +78 -0
- package/skill/tools/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +518 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Dispatcher.md +842 -0
- package/skill/tools/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +171 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Errors.md +624 -0
- package/skill/tools/node_modules/undici/docs/docs/api/EventSource.md +358 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Fetch.md +721 -0
- package/skill/tools/node_modules/undici/docs/docs/api/GlobalInstallation.md +121 -0
- package/skill/tools/node_modules/undici/docs/docs/api/H2CClient.md +386 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Interceptors.md +439 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockAgent.md +622 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockCallHistory.md +371 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +206 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockClient.md +199 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockErrors.md +63 -0
- package/skill/tools/node_modules/undici/docs/docs/api/MockPool.md +618 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Pool.md +278 -0
- package/skill/tools/node_modules/undici/docs/docs/api/PoolStats.md +141 -0
- package/skill/tools/node_modules/undici/docs/docs/api/ProxyAgent.md +248 -0
- package/skill/tools/node_modules/undici/docs/docs/api/RedirectHandler.md +279 -0
- package/skill/tools/node_modules/undici/docs/docs/api/RetryAgent.md +136 -0
- package/skill/tools/node_modules/undici/docs/docs/api/RetryHandler.md +200 -0
- package/skill/tools/node_modules/undici/docs/docs/api/RoundRobinPool.md +239 -0
- package/skill/tools/node_modules/undici/docs/docs/api/SnapshotAgent.md +361 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +256 -0
- package/skill/tools/node_modules/undici/docs/docs/api/Util.md +82 -0
- package/skill/tools/node_modules/undici/docs/docs/api/WebSocket.md +536 -0
- package/skill/tools/node_modules/undici/docs/docs/api/api-lifecycle.md +159 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/client-certificate.md +66 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/crawling.md +60 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/mocking-request.md +192 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/proxy.md +129 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +226 -0
- package/skill/tools/node_modules/undici/docs/docs/best-practices/writing-tests.md +65 -0
- package/skill/tools/node_modules/undici/docs/docs/getting-started.md +281 -0
- package/skill/tools/node_modules/undici/docs/docs/index.md +793 -0
- package/skill/tools/node_modules/undici/docs/docs/site.json +125 -0
- package/skill/tools/node_modules/undici/docs/docs/type-map.json +79 -0
- package/skill/tools/node_modules/undici/index-fetch.js +65 -0
- package/skill/tools/node_modules/undici/index.d.ts +3 -0
- package/skill/tools/node_modules/undici/index.js +236 -0
- package/skill/tools/node_modules/undici/lib/api/abort-signal.js +59 -0
- package/skill/tools/node_modules/undici/lib/api/api-connect.js +112 -0
- package/skill/tools/node_modules/undici/lib/api/api-pipeline.js +265 -0
- package/skill/tools/node_modules/undici/lib/api/api-request.js +244 -0
- package/skill/tools/node_modules/undici/lib/api/api-stream.js +270 -0
- package/skill/tools/node_modules/undici/lib/api/api-upgrade.js +121 -0
- package/skill/tools/node_modules/undici/lib/api/index.js +7 -0
- package/skill/tools/node_modules/undici/lib/api/readable.js +615 -0
- package/skill/tools/node_modules/undici/lib/cache/memory-cache-store.js +314 -0
- package/skill/tools/node_modules/undici/lib/cache/sqlite-cache-store.js +593 -0
- package/skill/tools/node_modules/undici/lib/core/connect.js +198 -0
- package/skill/tools/node_modules/undici/lib/core/constants.js +131 -0
- package/skill/tools/node_modules/undici/lib/core/diagnostics.js +227 -0
- package/skill/tools/node_modules/undici/lib/core/errors.js +534 -0
- package/skill/tools/node_modules/undici/lib/core/request.js +582 -0
- package/skill/tools/node_modules/undici/lib/core/socks5-client.js +422 -0
- package/skill/tools/node_modules/undici/lib/core/socks5-utils.js +212 -0
- package/skill/tools/node_modules/undici/lib/core/symbols.js +81 -0
- package/skill/tools/node_modules/undici/lib/core/tree.js +160 -0
- package/skill/tools/node_modules/undici/lib/core/util.js +1035 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/agent.js +181 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/balanced-pool.js +217 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/client-h1.js +1846 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/client-h2.js +1989 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/client.js +749 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/dispatcher-base.js +198 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/dispatcher.js +58 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +127 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +190 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/h2c-client.js +51 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/parser-h1.js +1065 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/pool-base.js +347 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/pool.js +229 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/proxy-agent.js +418 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/retry-agent.js +48 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/round-robin-pool.js +169 -0
- package/skill/tools/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +350 -0
- package/skill/tools/node_modules/undici/lib/encoding/index.js +33 -0
- package/skill/tools/node_modules/undici/lib/global.js +82 -0
- package/skill/tools/node_modules/undici/lib/handler/cache-handler.js +1222 -0
- package/skill/tools/node_modules/undici/lib/handler/cache-revalidation-handler.js +134 -0
- package/skill/tools/node_modules/undici/lib/handler/decorator-handler.js +76 -0
- package/skill/tools/node_modules/undici/lib/handler/deduplication-handler.js +540 -0
- package/skill/tools/node_modules/undici/lib/handler/redirect-handler.js +284 -0
- package/skill/tools/node_modules/undici/lib/handler/retry-handler.js +686 -0
- package/skill/tools/node_modules/undici/lib/interceptor/cache.js +771 -0
- package/skill/tools/node_modules/undici/lib/interceptor/decompress.js +574 -0
- package/skill/tools/node_modules/undici/lib/interceptor/deduplicate.js +118 -0
- package/skill/tools/node_modules/undici/lib/interceptor/dns.js +593 -0
- package/skill/tools/node_modules/undici/lib/interceptor/dump.js +99 -0
- package/skill/tools/node_modules/undici/lib/interceptor/redirect.js +21 -0
- package/skill/tools/node_modules/undici/lib/interceptor/response-error.js +139 -0
- package/skill/tools/node_modules/undici/lib/interceptor/retry.js +19 -0
- package/skill/tools/node_modules/undici/lib/llhttp/constants.d.ts +195 -0
- package/skill/tools/node_modules/undici/lib/llhttp/constants.js +531 -0
- package/skill/tools/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
- package/skill/tools/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
- package/skill/tools/node_modules/undici/lib/llhttp/utils.d.ts +2 -0
- package/skill/tools/node_modules/undici/lib/llhttp/utils.js +12 -0
- package/skill/tools/node_modules/undici/lib/milo/LICENSE.md +7 -0
- package/skill/tools/node_modules/undici/lib/milo/no-simd.js +1002 -0
- package/skill/tools/node_modules/undici/lib/milo/simd.js +1002 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-agent.js +255 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-call-history.js +248 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-client.js +68 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-errors.js +29 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-interceptor.js +227 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-pool.js +68 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-symbols.js +32 -0
- package/skill/tools/node_modules/undici/lib/mock/mock-utils.js +730 -0
- package/skill/tools/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
- package/skill/tools/node_modules/undici/lib/mock/snapshot-agent.js +371 -0
- package/skill/tools/node_modules/undici/lib/mock/snapshot-recorder.js +624 -0
- package/skill/tools/node_modules/undici/lib/mock/snapshot-utils.js +159 -0
- package/skill/tools/node_modules/undici/lib/util/cache.js +764 -0
- package/skill/tools/node_modules/undici/lib/util/date.js +670 -0
- package/skill/tools/node_modules/undici/lib/util/runtime-features.js +93 -0
- package/skill/tools/node_modules/undici/lib/util/stats.js +32 -0
- package/skill/tools/node_modules/undici/lib/util/timers.js +425 -0
- package/skill/tools/node_modules/undici/lib/web/cache/cache.js +871 -0
- package/skill/tools/node_modules/undici/lib/web/cache/cachestorage.js +158 -0
- package/skill/tools/node_modules/undici/lib/web/cache/util.js +45 -0
- package/skill/tools/node_modules/undici/lib/web/cookies/constants.js +12 -0
- package/skill/tools/node_modules/undici/lib/web/cookies/index.js +211 -0
- package/skill/tools/node_modules/undici/lib/web/cookies/parse.js +318 -0
- package/skill/tools/node_modules/undici/lib/web/cookies/util.js +371 -0
- package/skill/tools/node_modules/undici/lib/web/eventsource/eventsource-stream.js +575 -0
- package/skill/tools/node_modules/undici/lib/web/eventsource/eventsource.js +547 -0
- package/skill/tools/node_modules/undici/lib/web/eventsource/util.js +60 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/LICENSE +21 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/body.js +583 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/constants.js +131 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/data-url.js +596 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/formdata-parser.js +594 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/formdata.js +272 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/global.js +40 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/headers.js +722 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/index.js +2451 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/request.js +1117 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/response.js +638 -0
- package/skill/tools/node_modules/undici/lib/web/fetch/util.js +1530 -0
- package/skill/tools/node_modules/undici/lib/web/infra/index.js +244 -0
- package/skill/tools/node_modules/undici/lib/web/subresource-integrity/Readme.md +9 -0
- package/skill/tools/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +307 -0
- package/skill/tools/node_modules/undici/lib/web/webidl/index.js +992 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/connection.js +350 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/constants.js +126 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/events.js +348 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/frame.js +127 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/permessage-deflate.js +105 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/receiver.js +530 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/sender.js +109 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/stream/websocketerror.js +107 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/stream/websocketstream.js +511 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/util.js +347 -0
- package/skill/tools/node_modules/undici/lib/web/websocket/websocket.js +783 -0
- package/skill/tools/node_modules/undici/package.json +154 -0
- package/skill/tools/node_modules/undici/scripts/strip-comments.js +10 -0
- package/skill/tools/node_modules/undici/types/README.md +6 -0
- package/skill/tools/node_modules/undici/types/agent.d.ts +30 -0
- package/skill/tools/node_modules/undici/types/api.d.ts +43 -0
- package/skill/tools/node_modules/undici/types/balanced-pool.d.ts +30 -0
- package/skill/tools/node_modules/undici/types/cache-interceptor.d.ts +189 -0
- package/skill/tools/node_modules/undici/types/cache.d.ts +36 -0
- package/skill/tools/node_modules/undici/types/client-stats.d.ts +15 -0
- package/skill/tools/node_modules/undici/types/client.d.ts +190 -0
- package/skill/tools/node_modules/undici/types/connector.d.ts +37 -0
- package/skill/tools/node_modules/undici/types/content-type.d.ts +21 -0
- package/skill/tools/node_modules/undici/types/cookies.d.ts +30 -0
- package/skill/tools/node_modules/undici/types/diagnostics-channel.d.ts +75 -0
- package/skill/tools/node_modules/undici/types/dispatcher.d.ts +253 -0
- package/skill/tools/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
- package/skill/tools/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
- package/skill/tools/node_modules/undici/types/errors.d.ts +202 -0
- package/skill/tools/node_modules/undici/types/eventsource.d.ts +66 -0
- package/skill/tools/node_modules/undici/types/fetch.d.ts +235 -0
- package/skill/tools/node_modules/undici/types/formdata.d.ts +108 -0
- package/skill/tools/node_modules/undici/types/global-dispatcher.d.ts +9 -0
- package/skill/tools/node_modules/undici/types/global-origin.d.ts +7 -0
- package/skill/tools/node_modules/undici/types/h2c-client.d.ts +73 -0
- package/skill/tools/node_modules/undici/types/handlers.d.ts +16 -0
- package/skill/tools/node_modules/undici/types/header.d.ts +165 -0
- package/skill/tools/node_modules/undici/types/index.d.ts +93 -0
- package/skill/tools/node_modules/undici/types/interceptors.d.ts +87 -0
- package/skill/tools/node_modules/undici/types/mock-agent.d.ts +69 -0
- package/skill/tools/node_modules/undici/types/mock-call-history.d.ts +111 -0
- package/skill/tools/node_modules/undici/types/mock-client.d.ts +27 -0
- package/skill/tools/node_modules/undici/types/mock-errors.d.ts +12 -0
- package/skill/tools/node_modules/undici/types/mock-interceptor.d.ts +98 -0
- package/skill/tools/node_modules/undici/types/mock-pool.d.ts +27 -0
- package/skill/tools/node_modules/undici/types/patch.d.ts +29 -0
- package/skill/tools/node_modules/undici/types/pool-stats.d.ts +19 -0
- package/skill/tools/node_modules/undici/types/pool.d.ts +39 -0
- package/skill/tools/node_modules/undici/types/proxy-agent.d.ts +36 -0
- package/skill/tools/node_modules/undici/types/readable.d.ts +68 -0
- package/skill/tools/node_modules/undici/types/retry-agent.d.ts +8 -0
- package/skill/tools/node_modules/undici/types/retry-handler.d.ts +125 -0
- package/skill/tools/node_modules/undici/types/round-robin-pool.d.ts +39 -0
- package/skill/tools/node_modules/undici/types/snapshot-agent.d.ts +113 -0
- package/skill/tools/node_modules/undici/types/socks5-proxy-agent.d.ts +27 -0
- package/skill/tools/node_modules/undici/types/util.d.ts +18 -0
- package/skill/tools/node_modules/undici/types/utility.d.ts +7 -0
- package/skill/tools/node_modules/undici/types/webidl.d.ts +352 -0
- package/skill/tools/node_modules/undici/types/websocket.d.ts +188 -0
- package/skill/tools/node_modules/xtend/.jshintrc +30 -0
- package/skill/tools/node_modules/xtend/LICENSE +20 -0
- package/skill/tools/node_modules/xtend/README.md +32 -0
- package/skill/tools/node_modules/xtend/immutable.js +19 -0
- package/skill/tools/node_modules/xtend/mutable.js +17 -0
- package/skill/tools/node_modules/xtend/package.json +55 -0
- package/skill/tools/node_modules/xtend/test.js +103 -0
- package/skill/tools/package-lock.json +172 -0
- package/skill/tools/package.json +9 -0
- package/skill/tools/transfer_core.js +414 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { kProxy, kClose, kDestroy, kDispatch } = require('../core/symbols')
|
|
4
|
+
const Agent = require('./agent')
|
|
5
|
+
const Pool = require('./pool')
|
|
6
|
+
const DispatcherBase = require('./dispatcher-base')
|
|
7
|
+
const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError, ProxyConnectionError } = require('../core/errors')
|
|
8
|
+
const buildConnector = require('../core/connect')
|
|
9
|
+
const Client = require('./client')
|
|
10
|
+
const { channels } = require('../core/diagnostics')
|
|
11
|
+
const Socks5ProxyAgent = require('./socks5-proxy-agent')
|
|
12
|
+
const { hasSafeIterator } = require('../core/util')
|
|
13
|
+
|
|
14
|
+
const kAgent = Symbol('proxy agent')
|
|
15
|
+
const kClient = Symbol('proxy client')
|
|
16
|
+
const kProxyHeaders = Symbol('proxy headers')
|
|
17
|
+
const kRequestTls = Symbol('request tls settings')
|
|
18
|
+
const kProxyTls = Symbol('proxy tls settings')
|
|
19
|
+
const kConnectEndpoint = Symbol('connect endpoint function')
|
|
20
|
+
const kConnectEndpointHTTP1 = Symbol('connect endpoint function (http/1.1 only)')
|
|
21
|
+
const kTunnelProxy = Symbol('tunnel proxy')
|
|
22
|
+
const proxyAuthorization = 'proxy-authorization'
|
|
23
|
+
|
|
24
|
+
function defaultProtocolPort (protocol) {
|
|
25
|
+
return protocol === 'https:' ? 443 : 80
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function defaultFactory (origin, opts) {
|
|
29
|
+
return new Pool(origin, opts)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const noop = () => {}
|
|
33
|
+
|
|
34
|
+
function defaultAgentFactory (origin, opts) {
|
|
35
|
+
if (opts.connections === 1) {
|
|
36
|
+
return new Client(origin, opts)
|
|
37
|
+
}
|
|
38
|
+
return new Pool(origin, opts)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function shouldProxyTunnel (requestProtocol, proxyTunnel) {
|
|
42
|
+
return proxyTunnel === true || requestProtocol !== 'http:'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
class Http1ProxyWrapper extends DispatcherBase {
|
|
46
|
+
#client
|
|
47
|
+
#proxyServername
|
|
48
|
+
|
|
49
|
+
constructor (proxyUrl, { headers = {}, connect, factory, proxyServername }) {
|
|
50
|
+
if (!proxyUrl) {
|
|
51
|
+
throw new InvalidArgumentError('Proxy URL is mandatory')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
super()
|
|
55
|
+
|
|
56
|
+
this[kProxyHeaders] = headers
|
|
57
|
+
this.#proxyServername = proxyServername
|
|
58
|
+
if (factory) {
|
|
59
|
+
this.#client = factory(proxyUrl, { connect })
|
|
60
|
+
} else {
|
|
61
|
+
this.#client = new Client(proxyUrl, { connect })
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
[kDispatch] (opts, handler) {
|
|
66
|
+
const onResponseStart = handler.onResponseStart
|
|
67
|
+
handler.onResponseStart = function (controller, statusCode, data, statusMessage) {
|
|
68
|
+
if (statusCode === 407) {
|
|
69
|
+
if (typeof handler.onResponseError === 'function') {
|
|
70
|
+
handler.onResponseError(controller, new InvalidArgumentError('Proxy Authentication Required (407)'))
|
|
71
|
+
}
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
if (onResponseStart) onResponseStart.call(this, controller, statusCode, data, statusMessage)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Rewrite request as an HTTP1 Proxy request, without tunneling.
|
|
78
|
+
const {
|
|
79
|
+
origin,
|
|
80
|
+
path = '/',
|
|
81
|
+
headers = {}
|
|
82
|
+
} = opts
|
|
83
|
+
|
|
84
|
+
opts.path = origin + path
|
|
85
|
+
|
|
86
|
+
opts.headers = { ...this[kProxyHeaders], ...headers }
|
|
87
|
+
if (!hasHostHeader(headers)) {
|
|
88
|
+
opts.headers.host = new URL(origin).host
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Pin the SNI/cert hostname to the proxy. Without this the underlying
|
|
92
|
+
// Client would derive it from the (rewritten) Host header, which points
|
|
93
|
+
// at the target — wrong for the TLS handshake to the proxy itself.
|
|
94
|
+
if (this.#proxyServername != null) {
|
|
95
|
+
opts.servername = this.#proxyServername
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return this.#client[kDispatch](opts, handler)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[kClose] () {
|
|
102
|
+
return this.#client.close()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[kDestroy] (err) {
|
|
106
|
+
return this.#client.destroy(err)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
class ProxyAgent extends DispatcherBase {
|
|
111
|
+
constructor (opts) {
|
|
112
|
+
if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {
|
|
113
|
+
throw new InvalidArgumentError('Proxy uri is mandatory')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const { clientFactory = defaultFactory } = opts
|
|
117
|
+
if (typeof clientFactory !== 'function') {
|
|
118
|
+
throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const { proxyTunnel, connectTimeout } = opts
|
|
122
|
+
|
|
123
|
+
super(opts)
|
|
124
|
+
|
|
125
|
+
const url = this.#getUrl(opts)
|
|
126
|
+
const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url
|
|
127
|
+
|
|
128
|
+
this[kProxy] = { uri: href, protocol }
|
|
129
|
+
this[kRequestTls] = opts.requestTls
|
|
130
|
+
this[kProxyTls] = opts.proxyTls
|
|
131
|
+
this[kProxyHeaders] = opts.headers || {}
|
|
132
|
+
this[kTunnelProxy] = proxyTunnel
|
|
133
|
+
|
|
134
|
+
if (opts.auth && opts.token) {
|
|
135
|
+
throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
|
|
136
|
+
} else if (opts.auth) {
|
|
137
|
+
/* @deprecated in favour of opts.token */
|
|
138
|
+
this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
|
|
139
|
+
} else if (opts.token) {
|
|
140
|
+
this[kProxyHeaders]['proxy-authorization'] = opts.token
|
|
141
|
+
} else if (username && password) {
|
|
142
|
+
this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`
|
|
143
|
+
} else if (username) {
|
|
144
|
+
this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:`).toString('base64')}`
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const connect = buildConnector({ timeout: connectTimeout, ...opts.proxyTls })
|
|
148
|
+
const connectHTTP1 = buildConnector({ timeout: connectTimeout, ...opts.proxyTls, allowH2: false })
|
|
149
|
+
this[kConnectEndpoint] = buildConnector({ timeout: connectTimeout, ...opts.requestTls })
|
|
150
|
+
this[kConnectEndpointHTTP1] = buildConnector({ timeout: connectTimeout, ...opts.requestTls, allowH2: false })
|
|
151
|
+
|
|
152
|
+
const agentFactory = opts.factory || defaultAgentFactory
|
|
153
|
+
const factory = (origin, options) => {
|
|
154
|
+
const { protocol } = new URL(origin)
|
|
155
|
+
|
|
156
|
+
// Handle SOCKS5 proxy
|
|
157
|
+
if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {
|
|
158
|
+
return new Socks5ProxyAgent(this[kProxy].uri, {
|
|
159
|
+
headers: this[kProxyHeaders],
|
|
160
|
+
connect,
|
|
161
|
+
factory: agentFactory,
|
|
162
|
+
username: opts.username || username,
|
|
163
|
+
password: opts.password || password,
|
|
164
|
+
connectTimeout,
|
|
165
|
+
proxyTls: opts.proxyTls,
|
|
166
|
+
requestTls: opts.requestTls
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (!shouldProxyTunnel(protocol, this[kTunnelProxy])) {
|
|
171
|
+
const forwardConnect = this[kProxy].protocol === 'https:'
|
|
172
|
+
? (opts, cb) => connectHTTP1(opts, (err, socket) => {
|
|
173
|
+
if (err && err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
|
|
174
|
+
cb(new SecureProxyConnectionError(err))
|
|
175
|
+
} else {
|
|
176
|
+
cb(err, socket)
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
: connectHTTP1
|
|
180
|
+
return new Http1ProxyWrapper(this[kProxy].uri, {
|
|
181
|
+
headers: this[kProxyHeaders],
|
|
182
|
+
connect: forwardConnect,
|
|
183
|
+
factory: agentFactory,
|
|
184
|
+
proxyServername: this[kProxy].protocol === 'https:'
|
|
185
|
+
? (this[kProxyTls]?.servername || proxyHostname)
|
|
186
|
+
: undefined
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
return agentFactory(origin, options)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// For SOCKS5 proxies, we don't need a client to the proxy itself
|
|
193
|
+
// The SOCKS5 connection is handled within Socks5ProxyAgent
|
|
194
|
+
if (protocol === 'socks5:' || protocol === 'socks:') {
|
|
195
|
+
this[kClient] = null
|
|
196
|
+
} else {
|
|
197
|
+
this[kClient] = clientFactory(url, { connect })
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
this[kAgent] = new Agent({
|
|
201
|
+
...opts,
|
|
202
|
+
factory,
|
|
203
|
+
connect: async (opts, callback) => {
|
|
204
|
+
// SOCKS5 proxies handle their own connections via Socks5ProxyAgent,
|
|
205
|
+
// so this connect function should never be called for them.
|
|
206
|
+
if (!this[kClient]) {
|
|
207
|
+
callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'))
|
|
208
|
+
return
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
let requestedPath = opts.host
|
|
212
|
+
if (!opts.port) {
|
|
213
|
+
requestedPath += `:${defaultProtocolPort(opts.protocol)}`
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const connectParams = {
|
|
217
|
+
origin,
|
|
218
|
+
port,
|
|
219
|
+
path: requestedPath,
|
|
220
|
+
signal: opts.signal,
|
|
221
|
+
headers: {
|
|
222
|
+
...this[kProxyHeaders],
|
|
223
|
+
host: opts.host,
|
|
224
|
+
...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})
|
|
225
|
+
},
|
|
226
|
+
servername: this[kProxyTls]?.servername || proxyHostname
|
|
227
|
+
}
|
|
228
|
+
const { socket, statusCode } = await this[kClient].connect(connectParams)
|
|
229
|
+
if (statusCode !== 200) {
|
|
230
|
+
socket.on('error', noop).destroy()
|
|
231
|
+
callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (channels.proxyConnected.hasSubscribers) {
|
|
236
|
+
channels.proxyConnected.publish({
|
|
237
|
+
socket,
|
|
238
|
+
connectParams
|
|
239
|
+
})
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (opts.protocol !== 'https:') {
|
|
243
|
+
callback(null, socket)
|
|
244
|
+
return
|
|
245
|
+
}
|
|
246
|
+
let servername
|
|
247
|
+
if (this[kRequestTls]) {
|
|
248
|
+
servername = this[kRequestTls].servername
|
|
249
|
+
} else {
|
|
250
|
+
servername = opts.servername
|
|
251
|
+
}
|
|
252
|
+
const connectEndpoint = opts.allowH2 === false
|
|
253
|
+
? this[kConnectEndpointHTTP1]
|
|
254
|
+
: this[kConnectEndpoint]
|
|
255
|
+
|
|
256
|
+
connectEndpoint({ ...opts, servername, httpSocket: socket }, callback)
|
|
257
|
+
} catch (err) {
|
|
258
|
+
if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
|
|
259
|
+
// Throw a custom error to avoid loop in client.js#connect
|
|
260
|
+
callback(new SecureProxyConnectionError(err))
|
|
261
|
+
} else if (err.code === 'UND_ERR_SOCKET') {
|
|
262
|
+
// A socket failure while establishing the tunnel means the CONNECT
|
|
263
|
+
// never completed, so there is nothing to recover - the proxy just
|
|
264
|
+
// tore down the connection. client.js#onError treats UND_ERR_SOCKET
|
|
265
|
+
// as a recoverable error on an established connection and leaves the
|
|
266
|
+
// request queued, which makes connect() retry forever. Surface it as
|
|
267
|
+
// a non-recoverable proxy error so the request fails instead. (#3897)
|
|
268
|
+
callback(new ProxyConnectionError(err))
|
|
269
|
+
} else {
|
|
270
|
+
callback(err)
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
})
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
dispatch (opts, handler) {
|
|
278
|
+
let headers = buildHeaders(opts.headers)
|
|
279
|
+
throwIfProxyAuthIsSent(headers)
|
|
280
|
+
|
|
281
|
+
if (headers && !hasHostHeader(headers)) {
|
|
282
|
+
if (headers === opts.headers) {
|
|
283
|
+
headers = { ...headers }
|
|
284
|
+
}
|
|
285
|
+
headers.host = new URL(opts.origin).host
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return this[kAgent].dispatch(
|
|
289
|
+
{
|
|
290
|
+
...opts,
|
|
291
|
+
headers
|
|
292
|
+
},
|
|
293
|
+
handler
|
|
294
|
+
)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts
|
|
299
|
+
* @returns {URL}
|
|
300
|
+
*/
|
|
301
|
+
#getUrl (opts) {
|
|
302
|
+
if (typeof opts === 'string') {
|
|
303
|
+
return new URL(opts)
|
|
304
|
+
} else if (opts instanceof URL) {
|
|
305
|
+
return opts
|
|
306
|
+
} else {
|
|
307
|
+
return new URL(opts.uri)
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
[kClose] () {
|
|
312
|
+
const promises = [this[kAgent].close()]
|
|
313
|
+
if (this[kClient]) {
|
|
314
|
+
promises.push(this[kClient].close())
|
|
315
|
+
}
|
|
316
|
+
return Promise.all(promises)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
[kDestroy] () {
|
|
320
|
+
const promises = [this[kAgent].destroy()]
|
|
321
|
+
if (this[kClient]) {
|
|
322
|
+
promises.push(this[kClient].destroy())
|
|
323
|
+
}
|
|
324
|
+
return Promise.all(promises)
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* @param {string[] | Record<string, string> | Iterable<[string, string | string[] | undefined]>} headers
|
|
330
|
+
* @returns {Record<string, string | string[] | undefined>}
|
|
331
|
+
*/
|
|
332
|
+
function buildHeaders (headers) {
|
|
333
|
+
// When using undici.fetch, the headers list is stored
|
|
334
|
+
// as an array.
|
|
335
|
+
if (Array.isArray(headers)) {
|
|
336
|
+
/** @type {Record<string, string>} */
|
|
337
|
+
const headersPair = {}
|
|
338
|
+
|
|
339
|
+
for (let i = 0; i < headers.length; i += 2) {
|
|
340
|
+
if (isProxyAuthorizationHeader(headers[i])) {
|
|
341
|
+
throwProxyAuthError()
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
headersPair[headers[i]] = headers[i + 1]
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return headersPair
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Materialize iterable header containers (e.g. Map, Headers) into a record so
|
|
351
|
+
// that throwIfProxyAuthIsSent() can inspect their entries. Object.keys and
|
|
352
|
+
// for...in see nothing on a Map/Headers instance, so without this the
|
|
353
|
+
// Proxy-Authorization guard is bypassed and proxy credentials can reach the
|
|
354
|
+
// origin server (GHSA-6cv7-626c-qhqw).
|
|
355
|
+
if (headers && typeof headers === 'object' && hasSafeIterator(headers)) {
|
|
356
|
+
const headersPair = {}
|
|
357
|
+
|
|
358
|
+
for (const [key, value] of headers) {
|
|
359
|
+
if (!Object.hasOwn(headersPair, key)) {
|
|
360
|
+
headersPair[key] = value
|
|
361
|
+
continue
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const previous = headersPair[key]
|
|
365
|
+
const values = []
|
|
366
|
+
if (previous !== undefined) {
|
|
367
|
+
values.push(...(Array.isArray(previous) ? previous : [previous]))
|
|
368
|
+
}
|
|
369
|
+
if (value !== undefined) {
|
|
370
|
+
values.push(...(Array.isArray(value) ? value : [value]))
|
|
371
|
+
}
|
|
372
|
+
headersPair[key] = values.length > 1 ? values : values[0]
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return headersPair
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return headers
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* @param {Record<string, string>} headers
|
|
383
|
+
*
|
|
384
|
+
* Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers
|
|
385
|
+
* Nevertheless, it was changed and to avoid a security vulnerability by end users
|
|
386
|
+
* this check was created.
|
|
387
|
+
* It should be removed in the next major version for performance reasons
|
|
388
|
+
*/
|
|
389
|
+
function throwIfProxyAuthIsSent (headers) {
|
|
390
|
+
for (const key in headers) {
|
|
391
|
+
if (isProxyAuthorizationHeader(key)) {
|
|
392
|
+
throwProxyAuthError()
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* @param {string} key
|
|
399
|
+
* @returns {boolean}
|
|
400
|
+
*/
|
|
401
|
+
function isProxyAuthorizationHeader (key) {
|
|
402
|
+
return key.length === proxyAuthorization.length && key.toLowerCase() === proxyAuthorization
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function hasHostHeader (headers) {
|
|
406
|
+
for (const key in headers) {
|
|
407
|
+
if (key.length === 4 && key.toLowerCase() === 'host') {
|
|
408
|
+
return true
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return false
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function throwProxyAuthError () {
|
|
415
|
+
throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
module.exports = ProxyAgent
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const Dispatcher = require('./dispatcher')
|
|
4
|
+
const RetryHandler = require('../handler/retry-handler')
|
|
5
|
+
const { kOriginless, kUrl } = require('../core/symbols')
|
|
6
|
+
|
|
7
|
+
class RetryAgent extends Dispatcher {
|
|
8
|
+
#agent = null
|
|
9
|
+
#options = null
|
|
10
|
+
constructor (agent, options = {}) {
|
|
11
|
+
super(options)
|
|
12
|
+
this.#agent = agent
|
|
13
|
+
this.#options = options
|
|
14
|
+
this[kUrl] = agent[kUrl]
|
|
15
|
+
this[kOriginless] = agent[kOriginless]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
dispatch (opts, handler) {
|
|
19
|
+
const retry = new RetryHandler({
|
|
20
|
+
...opts,
|
|
21
|
+
retryOptions: this.#options
|
|
22
|
+
}, {
|
|
23
|
+
dispatch: this.#agent.dispatch.bind(this.#agent),
|
|
24
|
+
handler
|
|
25
|
+
})
|
|
26
|
+
return this.#agent.dispatch(opts, retry)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// WebSocket and EventSource read their receive limits from the dispatcher
|
|
30
|
+
// they are given, so report the wrapped agent's settings rather than none.
|
|
31
|
+
get webSocketOptions () {
|
|
32
|
+
return this.#agent.webSocketOptions
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get eventSourceOptions () {
|
|
36
|
+
return this.#agent.eventSourceOptions
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
close () {
|
|
40
|
+
return this.#agent.close()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
destroy () {
|
|
44
|
+
return this.#agent.destroy()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = RetryAgent
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
PoolBase,
|
|
5
|
+
kClients,
|
|
6
|
+
kNeedDrain,
|
|
7
|
+
kAddClient,
|
|
8
|
+
kGetDispatcher,
|
|
9
|
+
kHasDispatcher,
|
|
10
|
+
kRemoveClient,
|
|
11
|
+
kRetireClient,
|
|
12
|
+
kDrainQueue
|
|
13
|
+
} = require('./pool-base')
|
|
14
|
+
const Client = require('./client')
|
|
15
|
+
const {
|
|
16
|
+
InvalidArgumentError
|
|
17
|
+
} = require('../core/errors')
|
|
18
|
+
const util = require('../core/util')
|
|
19
|
+
const { kUrl, kQueued } = require('../core/symbols')
|
|
20
|
+
const buildConnector = require('../core/connect')
|
|
21
|
+
|
|
22
|
+
const kOptions = Symbol('options')
|
|
23
|
+
const kConnections = Symbol('connections')
|
|
24
|
+
const kFactory = Symbol('factory')
|
|
25
|
+
const kIndex = Symbol('index')
|
|
26
|
+
|
|
27
|
+
function defaultFactory (origin, opts) {
|
|
28
|
+
return new Client(origin, opts)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class RoundRobinPool extends PoolBase {
|
|
32
|
+
constructor (origin, {
|
|
33
|
+
connections,
|
|
34
|
+
factory = defaultFactory,
|
|
35
|
+
connect,
|
|
36
|
+
connectTimeout,
|
|
37
|
+
tls,
|
|
38
|
+
maxCachedSessions,
|
|
39
|
+
socketPath,
|
|
40
|
+
autoSelectFamily,
|
|
41
|
+
autoSelectFamilyAttemptTimeout,
|
|
42
|
+
allowH2,
|
|
43
|
+
clientTtl,
|
|
44
|
+
...options
|
|
45
|
+
} = {}) {
|
|
46
|
+
if (connections != null && (!Number.isFinite(connections) || connections < 0)) {
|
|
47
|
+
throw new InvalidArgumentError('invalid connections')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (typeof factory !== 'function') {
|
|
51
|
+
throw new InvalidArgumentError('factory must be a function.')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
|
|
55
|
+
throw new InvalidArgumentError('connect must be a function or an object')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (typeof connect !== 'function') {
|
|
59
|
+
connect = buildConnector({
|
|
60
|
+
...tls,
|
|
61
|
+
maxCachedSessions,
|
|
62
|
+
allowH2,
|
|
63
|
+
socketPath,
|
|
64
|
+
timeout: connectTimeout,
|
|
65
|
+
...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
|
|
66
|
+
...connect
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
super(options)
|
|
71
|
+
|
|
72
|
+
this[kConnections] = connections || null
|
|
73
|
+
this[kUrl] = util.parseOrigin(origin)
|
|
74
|
+
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath }
|
|
75
|
+
this[kFactory] = factory
|
|
76
|
+
this[kIndex] = -1
|
|
77
|
+
|
|
78
|
+
this.on('connect', (origin, targets) => {
|
|
79
|
+
if (clientTtl != null && clientTtl > 0) {
|
|
80
|
+
for (const target of targets) {
|
|
81
|
+
Object.assign(target, { ttl: Date.now() })
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
this.on('connectionError', (origin, targets, error) => {
|
|
87
|
+
// Retire (close) the client rather than only dropping it from
|
|
88
|
+
// kClients: otherwise its drain listener keeps pulling requests from
|
|
89
|
+
// the pool queue onto a client that pool.destroy() can't reach.
|
|
90
|
+
for (const target of targets) {
|
|
91
|
+
if (this[kClients].includes(target)) {
|
|
92
|
+
this[kRetireClient](target)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The retired client no longer drains the pool queue, so hand any
|
|
97
|
+
// queued requests to another (possibly new) client.
|
|
98
|
+
if (this[kQueued] > 0) {
|
|
99
|
+
this[kDrainQueue](origin, targets.slice(1))
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
[kGetDispatcher] () {
|
|
105
|
+
const clientTtlOption = this[kOptions].clientTtl
|
|
106
|
+
|
|
107
|
+
// If we have no clients yet, create one
|
|
108
|
+
if (this[kClients].length === 0) {
|
|
109
|
+
const dispatcher = this[kFactory](this[kUrl], this[kOptions])
|
|
110
|
+
this[kAddClient](dispatcher)
|
|
111
|
+
return dispatcher
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Round-robin through existing clients
|
|
115
|
+
let checked = 0
|
|
116
|
+
while (checked < this[kClients].length) {
|
|
117
|
+
this[kIndex] = (this[kIndex] + 1) % this[kClients].length
|
|
118
|
+
const client = this[kClients][this[kIndex]]
|
|
119
|
+
|
|
120
|
+
// Check if client is stale (TTL expired)
|
|
121
|
+
if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {
|
|
122
|
+
this[kRemoveClient](client)
|
|
123
|
+
this[kIndex]--
|
|
124
|
+
continue
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Return client if it's not draining
|
|
128
|
+
if (!client[kNeedDrain]) {
|
|
129
|
+
return client
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
checked++
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// All clients are busy, create a new one if we haven't reached the limit
|
|
136
|
+
if (!this[kConnections] || this[kClients].length < this[kConnections]) {
|
|
137
|
+
const dispatcher = this[kFactory](this[kUrl], this[kOptions])
|
|
138
|
+
this[kAddClient](dispatcher)
|
|
139
|
+
return dispatcher
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
[kHasDispatcher] () {
|
|
144
|
+
const clientTtlOption = this[kOptions].clientTtl
|
|
145
|
+
for (let i = 0; i < this[kClients].length; i++) {
|
|
146
|
+
const client = this[kClients][i]
|
|
147
|
+
|
|
148
|
+
if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {
|
|
149
|
+
this[kRemoveClient](client)
|
|
150
|
+
if (i <= this[kIndex]) {
|
|
151
|
+
this[kIndex]--
|
|
152
|
+
}
|
|
153
|
+
i--
|
|
154
|
+
} else if (!client[kNeedDrain]) {
|
|
155
|
+
return true
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!this[kConnections] || this[kClients].length < this[kConnections]) {
|
|
160
|
+
const dispatcher = this[kFactory](this[kUrl], this[kOptions])
|
|
161
|
+
this[kAddClient](dispatcher)
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return false
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
module.exports = RoundRobinPool
|