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,771 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const assert = require('node:assert')
|
|
4
|
+
const { Readable } = require('node:stream')
|
|
5
|
+
const util = require('../core/util')
|
|
6
|
+
const CacheHandler = require('../handler/cache-handler')
|
|
7
|
+
const MemoryCacheStore = require('../cache/memory-cache-store')
|
|
8
|
+
const CacheRevalidationHandler = require('../handler/cache-revalidation-handler')
|
|
9
|
+
const {
|
|
10
|
+
assertCacheStore,
|
|
11
|
+
assertCacheMethods,
|
|
12
|
+
getInterceptorOrigin,
|
|
13
|
+
makeCacheKey,
|
|
14
|
+
normalizeHeaders,
|
|
15
|
+
parseCacheControlHeader,
|
|
16
|
+
isInvalidOrWildcardVaryHeader,
|
|
17
|
+
parseVaryHeader,
|
|
18
|
+
isEtagUsable
|
|
19
|
+
} = require('../util/cache.js')
|
|
20
|
+
const { AbortError } = require('../core/errors.js')
|
|
21
|
+
const { parseHttpDate } = require('../util/date.js')
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {(string | RegExp)[] | undefined} origins
|
|
25
|
+
* @param {string} name
|
|
26
|
+
*/
|
|
27
|
+
function assertCacheOrigins (origins, name) {
|
|
28
|
+
if (origins === undefined) return
|
|
29
|
+
if (!Array.isArray(origins)) {
|
|
30
|
+
throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`)
|
|
31
|
+
}
|
|
32
|
+
for (let i = 0; i < origins.length; i++) {
|
|
33
|
+
const origin = origins[i]
|
|
34
|
+
if (typeof origin !== 'string' && !(origin instanceof RegExp)) {
|
|
35
|
+
throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const nop = () => {}
|
|
41
|
+
|
|
42
|
+
function trimOWS (value) {
|
|
43
|
+
return value.replace(/^[\t ]+|[\t ]+$/g, '')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function arrayIncludes (array, value) {
|
|
47
|
+
for (let i = 0; i < array.length; i++) {
|
|
48
|
+
if (array[i] === value) {
|
|
49
|
+
return true
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return false
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function hasPragmaNoCache (headers) {
|
|
57
|
+
const pragma = headers?.pragma
|
|
58
|
+
if (!pragma) {
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const values = Array.isArray(pragma) ? pragma : [pragma]
|
|
63
|
+
for (let i = 0; i < values.length; i++) {
|
|
64
|
+
const value = values[i]
|
|
65
|
+
if (typeof value !== 'string') {
|
|
66
|
+
continue
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const directives = value.split(',')
|
|
70
|
+
for (let j = 0; j < directives.length; j++) {
|
|
71
|
+
if (trimOWS(directives[j]).toLowerCase() === 'no-cache') {
|
|
72
|
+
return true
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return false
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @typedef {(options: import('../../types/dispatcher.d.ts').default.DispatchOptions, handler: import('../../types/dispatcher.d.ts').default.DispatchHandler) => void} DispatchFn
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
86
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives
|
|
87
|
+
* @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts
|
|
88
|
+
* @returns {boolean}
|
|
89
|
+
*/
|
|
90
|
+
function needsRevalidation (result, cacheControlDirectives, { headers = {} }) {
|
|
91
|
+
// Always revalidate requests with the no-cache request directive.
|
|
92
|
+
if (cacheControlDirectives?.['no-cache']) {
|
|
93
|
+
return true
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Always revalidate requests with unqualified no-cache response directive.
|
|
97
|
+
if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) {
|
|
98
|
+
return true
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Always revalidate requests with conditional headers.
|
|
102
|
+
if (headers['if-modified-since'] || headers['if-none-match']) {
|
|
103
|
+
return true
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return false
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
111
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
|
|
112
|
+
* @returns {boolean}
|
|
113
|
+
*/
|
|
114
|
+
function staleResponseRequiresRevalidation (result, cacheType) {
|
|
115
|
+
return result.cacheControlDirectives?.['must-revalidate'] === true ||
|
|
116
|
+
(cacheType === 'shared' && (
|
|
117
|
+
result.cacheControlDirectives?.['proxy-revalidate'] === true ||
|
|
118
|
+
// https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10
|
|
119
|
+
// s-maxage implies proxy-revalidate for shared caches.
|
|
120
|
+
result.cacheControlDirectives?.['s-maxage'] !== undefined
|
|
121
|
+
))
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
|
|
126
|
+
* @param {import('../../types/header.d.ts').IncomingHttpHeaders} headers
|
|
127
|
+
* @returns {boolean}
|
|
128
|
+
*/
|
|
129
|
+
function revalidationResponseDisallowsCachedReuse (cacheType, headers) {
|
|
130
|
+
if (
|
|
131
|
+
(headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) ||
|
|
132
|
+
(cacheType === 'shared' && Object.hasOwn(headers, 'set-cookie'))
|
|
133
|
+
) {
|
|
134
|
+
return true
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const cacheControl = headers['cache-control']
|
|
138
|
+
if (!cacheControl) {
|
|
139
|
+
return false
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const cacheControlDirectives = parseCacheControlHeader(cacheControl)
|
|
143
|
+
return cacheControlDirectives['no-store'] === true ||
|
|
144
|
+
(cacheType === 'shared' && cacheControlDirectives.private === true)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function revalidationResponseUpdatesCacheControl (headers) {
|
|
148
|
+
return headers['cache-control'] !== undefined
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
153
|
+
* @param {Record<string, string | string[] | null> | undefined} varyDirectives
|
|
154
|
+
* @returns {boolean}
|
|
155
|
+
*/
|
|
156
|
+
function revalidationResponseAddsVary (result, varyDirectives) {
|
|
157
|
+
if (!varyDirectives) {
|
|
158
|
+
return false
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
for (const key in varyDirectives) {
|
|
162
|
+
if (result.vary == null || !Object.hasOwn(result.vary, key)) {
|
|
163
|
+
return true
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return false
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function deleteCachedValue (store, cacheKey) {
|
|
171
|
+
try {
|
|
172
|
+
store.delete(cacheKey)?.catch?.(nop)
|
|
173
|
+
} catch {
|
|
174
|
+
// Fail silently
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function getUsableLastModified (headers) {
|
|
179
|
+
const lastModified = headers?.['last-modified']
|
|
180
|
+
if (typeof lastModified === 'string' && parseHttpDate(lastModified)) {
|
|
181
|
+
return lastModified
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function makeRevalidationHeaders (opts, result) {
|
|
186
|
+
const headers = {
|
|
187
|
+
...opts.headers,
|
|
188
|
+
'if-modified-since': getUsableLastModified(result.headers) ?? new Date(result.cachedAt).toUTCString()
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (result.etag) {
|
|
192
|
+
headers['if-none-match'] = result.etag
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (result.vary) {
|
|
196
|
+
for (const key in result.vary) {
|
|
197
|
+
if (result.vary[key] != null) {
|
|
198
|
+
headers[key] = result.vary[key]
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return headers
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function revalidationTargetMatchesCacheKey (cacheKey, context) {
|
|
207
|
+
const history = context?.history
|
|
208
|
+
if (!Array.isArray(history) || history.length === 0) {
|
|
209
|
+
return true
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const cachedUrl = new URL(cacheKey.path, cacheKey.origin)
|
|
214
|
+
const responseUrl = history[history.length - 1]
|
|
215
|
+
return responseUrl.origin === cachedUrl.origin &&
|
|
216
|
+
responseUrl.pathname === cachedUrl.pathname &&
|
|
217
|
+
responseUrl.search === cachedUrl.search
|
|
218
|
+
} catch {
|
|
219
|
+
return false
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function revalidationEtagMatchesCachedValue (result, headers) {
|
|
224
|
+
if (!Object.hasOwn(headers, 'etag')) {
|
|
225
|
+
return true
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const responseEtag = headers.etag
|
|
229
|
+
const cachedEtag = result.etag
|
|
230
|
+
if (
|
|
231
|
+
typeof responseEtag !== 'string' ||
|
|
232
|
+
typeof cachedEtag !== 'string' ||
|
|
233
|
+
!isEtagUsable(responseEtag) ||
|
|
234
|
+
!isEtagUsable(cachedEtag)
|
|
235
|
+
) {
|
|
236
|
+
return false
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (!responseEtag.startsWith('W/')) {
|
|
240
|
+
return responseEtag === cachedEtag
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const cachedOpaqueTag = cachedEtag.startsWith('W/') ? cachedEtag.slice(2) : cachedEtag
|
|
244
|
+
return responseEtag.slice(2) === cachedOpaqueTag
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
249
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives
|
|
250
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
|
|
251
|
+
* @returns {boolean}
|
|
252
|
+
*/
|
|
253
|
+
function isStale (result, cacheControlDirectives, cacheType) {
|
|
254
|
+
const now = Date.now()
|
|
255
|
+
// A zero freshness lifetime (e.g. max-age=0 with a validator) is never fresh,
|
|
256
|
+
// even when reused within the same millisecond or after a clock step back.
|
|
257
|
+
// https://www.rfc-editor.org/rfc/rfc9111.html#section-4.2
|
|
258
|
+
if (now > result.staleAt || result.staleAt <= result.cachedAt) {
|
|
259
|
+
// Response is stale
|
|
260
|
+
if (!staleResponseRequiresRevalidation(result, cacheType) && cacheControlDirectives?.['max-stale']) {
|
|
261
|
+
// There's a threshold where we can serve stale responses, let's see if
|
|
262
|
+
// we're in it
|
|
263
|
+
// https://www.rfc-editor.org/rfc/rfc9111.html#name-max-stale
|
|
264
|
+
const gracePeriod = result.staleAt + (cacheControlDirectives['max-stale'] * 1000)
|
|
265
|
+
return now > gracePeriod
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return true
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (cacheControlDirectives?.['min-fresh']) {
|
|
272
|
+
// https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.3
|
|
273
|
+
|
|
274
|
+
// At this point, staleAt is always > now
|
|
275
|
+
const timeLeftTillStale = result.staleAt - now
|
|
276
|
+
const threshold = cacheControlDirectives['min-fresh'] * 1000
|
|
277
|
+
|
|
278
|
+
return timeLeftTillStale <= threshold
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return false
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Check if we're within the stale-while-revalidate window for a stale response
|
|
286
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
287
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType
|
|
288
|
+
* @returns {boolean}
|
|
289
|
+
*/
|
|
290
|
+
function withinStaleWhileRevalidateWindow (result, cacheType) {
|
|
291
|
+
const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']
|
|
292
|
+
if (!staleWhileRevalidate || staleResponseRequiresRevalidation(result, cacheType)) {
|
|
293
|
+
return false
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const now = Date.now()
|
|
297
|
+
const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)
|
|
298
|
+
return now <= staleWhileRevalidateExpiry
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @param {DispatchFn} dispatch
|
|
303
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts
|
|
304
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
|
|
305
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler
|
|
306
|
+
* @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts
|
|
307
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl
|
|
308
|
+
*/
|
|
309
|
+
function handleUncachedResponse (
|
|
310
|
+
dispatch,
|
|
311
|
+
globalOpts,
|
|
312
|
+
cacheKey,
|
|
313
|
+
handler,
|
|
314
|
+
opts,
|
|
315
|
+
reqCacheControl
|
|
316
|
+
) {
|
|
317
|
+
if (reqCacheControl?.['only-if-cached']) {
|
|
318
|
+
let aborted = false
|
|
319
|
+
|
|
320
|
+
const controller = {
|
|
321
|
+
paused: false,
|
|
322
|
+
rawHeaders: [],
|
|
323
|
+
rawTrailers: [],
|
|
324
|
+
pause () {
|
|
325
|
+
this.paused = true
|
|
326
|
+
},
|
|
327
|
+
resume () {
|
|
328
|
+
this.paused = false
|
|
329
|
+
},
|
|
330
|
+
abort: (reason) => {
|
|
331
|
+
aborted = true
|
|
332
|
+
handler.onResponseError?.(controller, reason ?? new AbortError())
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
handler.onRequestStart?.(controller, null)
|
|
338
|
+
|
|
339
|
+
if (aborted) {
|
|
340
|
+
return
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
handler.onResponseStart?.(controller, 504, {}, 'Gateway Timeout')
|
|
344
|
+
if (aborted) {
|
|
345
|
+
return
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
handler.onResponseEnd?.(controller, {})
|
|
349
|
+
} catch (err) {
|
|
350
|
+
if (typeof handler.onResponseError === 'function') {
|
|
351
|
+
handler.onResponseError(controller, err)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return true
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler
|
|
363
|
+
* @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts
|
|
364
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
|
|
365
|
+
* @param {number} age
|
|
366
|
+
* @param {any} context
|
|
367
|
+
* @param {boolean} isStale
|
|
368
|
+
*/
|
|
369
|
+
function sendCachedValue (handler, opts, result, age, context, isStale) {
|
|
370
|
+
// TODO (perf): Readable.from path can be optimized...
|
|
371
|
+
const stream = util.isStream(result.body)
|
|
372
|
+
? result.body
|
|
373
|
+
: Readable.from(result.body ?? [])
|
|
374
|
+
|
|
375
|
+
assert(!stream.destroyed, 'stream should not be destroyed')
|
|
376
|
+
assert(!stream.readableDidRead, 'stream should not be readableDidRead')
|
|
377
|
+
|
|
378
|
+
let aborted = false
|
|
379
|
+
let abortReason = null
|
|
380
|
+
|
|
381
|
+
const controller = {
|
|
382
|
+
rawHeaders: [],
|
|
383
|
+
rawTrailers: [],
|
|
384
|
+
resume () {
|
|
385
|
+
stream.resume()
|
|
386
|
+
},
|
|
387
|
+
pause () {
|
|
388
|
+
stream.pause()
|
|
389
|
+
},
|
|
390
|
+
get paused () {
|
|
391
|
+
return stream.isPaused()
|
|
392
|
+
},
|
|
393
|
+
get aborted () {
|
|
394
|
+
return aborted
|
|
395
|
+
},
|
|
396
|
+
get reason () {
|
|
397
|
+
return abortReason
|
|
398
|
+
},
|
|
399
|
+
abort (reason) {
|
|
400
|
+
if (aborted) {
|
|
401
|
+
return
|
|
402
|
+
}
|
|
403
|
+
aborted = true
|
|
404
|
+
abortReason = reason ?? new AbortError()
|
|
405
|
+
stream.destroy(abortReason)
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
stream
|
|
410
|
+
.on('error', function (err) {
|
|
411
|
+
// Never rethrow: this runs from a stream event on a later tick, where a
|
|
412
|
+
// throw would crash the process. Like core's Request.onResponseError,
|
|
413
|
+
// the error is dropped if the handler has no onResponseError.
|
|
414
|
+
if (!this.readableEnded) {
|
|
415
|
+
handler.onResponseError?.(controller, err)
|
|
416
|
+
}
|
|
417
|
+
})
|
|
418
|
+
.on('close', function () {
|
|
419
|
+
if (!this.errored) {
|
|
420
|
+
try {
|
|
421
|
+
handler.onResponseEnd?.(controller, {})
|
|
422
|
+
} catch (err) {
|
|
423
|
+
// The stream is already closed, so the error can't be routed
|
|
424
|
+
// through it; report it to the handler directly instead.
|
|
425
|
+
handler.onResponseError?.(controller, err)
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
})
|
|
429
|
+
|
|
430
|
+
// Downstream handler calls below run outside the dispatcher's own error
|
|
431
|
+
// handling (on later ticks for the body, or inside a promise callback for
|
|
432
|
+
// async stores), so a throw must be converged to a per-request error
|
|
433
|
+
// instead of escaping as an uncaught exception.
|
|
434
|
+
try {
|
|
435
|
+
handler.onRequestStart?.(controller, context)
|
|
436
|
+
} catch (err) {
|
|
437
|
+
stream.destroy(err)
|
|
438
|
+
return
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if (stream.destroyed) {
|
|
442
|
+
return
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Add the age header
|
|
446
|
+
// https://www.rfc-editor.org/rfc/rfc9111.html#name-age
|
|
447
|
+
const headers = { ...result.headers, age: String(age) }
|
|
448
|
+
|
|
449
|
+
if (isStale) {
|
|
450
|
+
// Add warning header
|
|
451
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning
|
|
452
|
+
headers.warning = '110 - "response is stale"'
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
controller.rawHeaders = util.toRawHeaders(headers)
|
|
456
|
+
|
|
457
|
+
try {
|
|
458
|
+
handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage)
|
|
459
|
+
} catch (err) {
|
|
460
|
+
stream.destroy(err)
|
|
461
|
+
return
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if (opts.method === 'HEAD') {
|
|
465
|
+
stream.destroy()
|
|
466
|
+
} else {
|
|
467
|
+
stream.on('data', function (chunk) {
|
|
468
|
+
try {
|
|
469
|
+
handler.onResponseData?.(controller, chunk)
|
|
470
|
+
} catch (err) {
|
|
471
|
+
stream.destroy(err)
|
|
472
|
+
}
|
|
473
|
+
})
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* @param {DispatchFn} dispatch
|
|
479
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts
|
|
480
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
|
|
481
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler
|
|
482
|
+
* @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts
|
|
483
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl
|
|
484
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} result
|
|
485
|
+
*/
|
|
486
|
+
function handleResult (
|
|
487
|
+
dispatch,
|
|
488
|
+
globalOpts,
|
|
489
|
+
cacheKey,
|
|
490
|
+
handler,
|
|
491
|
+
opts,
|
|
492
|
+
reqCacheControl,
|
|
493
|
+
result
|
|
494
|
+
) {
|
|
495
|
+
if (!result) {
|
|
496
|
+
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Shared stores may outlive the Undici version that wrote them. Do not
|
|
500
|
+
// re-serve a Set-Cookie header from an existing shared-cache entry.
|
|
501
|
+
if (globalOpts.type === 'shared' && Object.hasOwn(result.headers, 'set-cookie')) {
|
|
502
|
+
if (util.isStream(result.body)) {
|
|
503
|
+
result.body.on('error', nop).destroy()
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
507
|
+
return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
const now = Date.now()
|
|
511
|
+
if (now > result.deleteAt) {
|
|
512
|
+
// Response is expired, cache store shouldn't have given this to us
|
|
513
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const age = Math.round((now - result.cachedAt) / 1000)
|
|
517
|
+
const requestMaxAgeExpired = reqCacheControl?.['max-age'] !== undefined && age >= reqCacheControl['max-age']
|
|
518
|
+
|
|
519
|
+
const stale = requestMaxAgeExpired || isStale(result, reqCacheControl, globalOpts.type)
|
|
520
|
+
const revalidate = requestMaxAgeExpired || needsRevalidation(result, reqCacheControl, opts)
|
|
521
|
+
|
|
522
|
+
// Check if the response is stale
|
|
523
|
+
if (stale || revalidate) {
|
|
524
|
+
if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {
|
|
525
|
+
// If body is a stream we can't revalidate...
|
|
526
|
+
// TODO (fix): This could be less strict...
|
|
527
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// RFC 5861: If we're within stale-while-revalidate window, serve stale immediately
|
|
531
|
+
// and revalidate in background, unless immediate revalidation is necessary
|
|
532
|
+
if (!revalidate && withinStaleWhileRevalidateWindow(result, globalOpts.type)) {
|
|
533
|
+
// Serve stale response immediately
|
|
534
|
+
sendCachedValue(handler, opts, result, age, null, true)
|
|
535
|
+
|
|
536
|
+
// Start background revalidation (fire-and-forget)
|
|
537
|
+
queueMicrotask(() => {
|
|
538
|
+
const headers = makeRevalidationHeaders(opts, result)
|
|
539
|
+
|
|
540
|
+
// Background revalidation - update cache if we get new data
|
|
541
|
+
dispatch(
|
|
542
|
+
{
|
|
543
|
+
...opts,
|
|
544
|
+
headers
|
|
545
|
+
},
|
|
546
|
+
new CacheHandler(globalOpts, cacheKey, {
|
|
547
|
+
// Silent handler that just updates the cache
|
|
548
|
+
onRequestStart () {},
|
|
549
|
+
onRequestUpgrade () {},
|
|
550
|
+
onResponseStart () {},
|
|
551
|
+
onResponseData () {},
|
|
552
|
+
onResponseEnd () {},
|
|
553
|
+
onResponseError () {}
|
|
554
|
+
})
|
|
555
|
+
)
|
|
556
|
+
})
|
|
557
|
+
|
|
558
|
+
return true
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
let withinStaleIfErrorThreshold = false
|
|
562
|
+
if (!staleResponseRequiresRevalidation(result, globalOpts.type)) {
|
|
563
|
+
const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']
|
|
564
|
+
if (staleIfErrorExpiry) {
|
|
565
|
+
withinStaleIfErrorThreshold = now < (result.staleAt + (staleIfErrorExpiry * 1000))
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
const headers = makeRevalidationHeaders(opts, result)
|
|
570
|
+
const refetch = () => {
|
|
571
|
+
if (util.isStream(result.body)) {
|
|
572
|
+
result.body.on('error', nop).destroy()
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
576
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// We need to revalidate the response
|
|
580
|
+
return dispatch(
|
|
581
|
+
{
|
|
582
|
+
...opts,
|
|
583
|
+
headers
|
|
584
|
+
},
|
|
585
|
+
new CacheRevalidationHandler(
|
|
586
|
+
(success, context, statusCode, headers) => {
|
|
587
|
+
if (success) {
|
|
588
|
+
if (statusCode === 304) {
|
|
589
|
+
if (
|
|
590
|
+
!revalidationTargetMatchesCacheKey(cacheKey, context) ||
|
|
591
|
+
!revalidationEtagMatchesCachedValue(result, headers) ||
|
|
592
|
+
revalidationResponseDisallowsCachedReuse(globalOpts.type, headers)
|
|
593
|
+
) {
|
|
594
|
+
return refetch()
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
if (revalidationResponseUpdatesCacheControl(headers)) {
|
|
598
|
+
deleteCachedValue(globalOpts.store, cacheKey)
|
|
599
|
+
} else if (revalidationResponseAddsVary(result, headers.vary ? parseVaryHeader(headers.vary, opts.headers) : undefined)) {
|
|
600
|
+
return refetch()
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// TODO: successful revalidation should be considered fresh (not give stale warning).
|
|
605
|
+
sendCachedValue(handler, opts, result, age, context, stale)
|
|
606
|
+
} else if (util.isStream(result.body)) {
|
|
607
|
+
result.body.on('error', nop).destroy()
|
|
608
|
+
}
|
|
609
|
+
},
|
|
610
|
+
new CacheHandler(globalOpts, cacheKey, handler),
|
|
611
|
+
withinStaleIfErrorThreshold
|
|
612
|
+
)
|
|
613
|
+
)
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Dump request body.
|
|
617
|
+
if (util.isStream(opts.body)) {
|
|
618
|
+
opts.body.on('error', nop).destroy()
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
sendCachedValue(handler, opts, result, age, null, false)
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts]
|
|
626
|
+
* @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}
|
|
627
|
+
*/
|
|
628
|
+
module.exports = (opts = {}) => {
|
|
629
|
+
const {
|
|
630
|
+
store = new MemoryCacheStore(),
|
|
631
|
+
methods = ['GET'],
|
|
632
|
+
cacheByDefault = undefined,
|
|
633
|
+
type = 'shared',
|
|
634
|
+
origins = undefined
|
|
635
|
+
} = opts
|
|
636
|
+
|
|
637
|
+
if (typeof opts !== 'object' || opts === null) {
|
|
638
|
+
throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
assertCacheStore(store, 'opts.store')
|
|
642
|
+
assertCacheMethods(methods, 'opts.methods')
|
|
643
|
+
assertCacheOrigins(origins, 'opts.origins')
|
|
644
|
+
|
|
645
|
+
if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {
|
|
646
|
+
throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') {
|
|
650
|
+
throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`)
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
const globalOpts = {
|
|
654
|
+
store,
|
|
655
|
+
methods,
|
|
656
|
+
cacheByDefault,
|
|
657
|
+
type
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
const safeMethodsToNotCache = []
|
|
661
|
+
for (let i = 0; i < util.safeHTTPMethods.length; i++) {
|
|
662
|
+
const method = util.safeHTTPMethods[i]
|
|
663
|
+
if (!arrayIncludes(methods, method)) {
|
|
664
|
+
safeMethodsToNotCache.push(method)
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
return (dispatch, interceptorOrigin) => {
|
|
669
|
+
return (opts, handler) => {
|
|
670
|
+
const requestOrigin = getInterceptorOrigin(opts, interceptorOrigin)
|
|
671
|
+
if (!requestOrigin || arrayIncludes(safeMethodsToNotCache, opts.method)) {
|
|
672
|
+
// We cannot safely cache without an authoritative origin, or this is
|
|
673
|
+
// not a method we want to cache.
|
|
674
|
+
return dispatch(opts, handler)
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// Check if origin is in whitelist
|
|
678
|
+
if (origins !== undefined) {
|
|
679
|
+
const normalizedRequestOrigin = requestOrigin.toString().toLowerCase()
|
|
680
|
+
let isAllowed = false
|
|
681
|
+
|
|
682
|
+
for (let i = 0; i < origins.length; i++) {
|
|
683
|
+
const allowed = origins[i]
|
|
684
|
+
if (typeof allowed === 'string') {
|
|
685
|
+
if (allowed.toLowerCase() === normalizedRequestOrigin) {
|
|
686
|
+
isAllowed = true
|
|
687
|
+
break
|
|
688
|
+
}
|
|
689
|
+
} else if (allowed.test(normalizedRequestOrigin)) {
|
|
690
|
+
isAllowed = true
|
|
691
|
+
break
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
if (!isAllowed) {
|
|
696
|
+
return dispatch(opts, handler)
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
opts = {
|
|
701
|
+
...opts,
|
|
702
|
+
headers: normalizeHeaders(opts)
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
const reqCacheControl = opts.headers?.['cache-control']
|
|
706
|
+
? parseCacheControlHeader(opts.headers['cache-control'])
|
|
707
|
+
: hasPragmaNoCache(opts.headers)
|
|
708
|
+
? { 'no-cache': true }
|
|
709
|
+
: undefined
|
|
710
|
+
|
|
711
|
+
if (reqCacheControl?.['no-store']) {
|
|
712
|
+
return dispatch(opts, handler)
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/**
|
|
716
|
+
* @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
|
|
717
|
+
*/
|
|
718
|
+
const cacheKey = makeCacheKey(opts, requestOrigin)
|
|
719
|
+
|
|
720
|
+
if (!arrayIncludes(util.safeHTTPMethods, opts.method)) {
|
|
721
|
+
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
const result = store.get(cacheKey)
|
|
725
|
+
|
|
726
|
+
if (result && typeof result.then === 'function') {
|
|
727
|
+
return result
|
|
728
|
+
.then(result => handleResult(dispatch,
|
|
729
|
+
globalOpts,
|
|
730
|
+
cacheKey,
|
|
731
|
+
handler,
|
|
732
|
+
opts,
|
|
733
|
+
reqCacheControl,
|
|
734
|
+
result
|
|
735
|
+
))
|
|
736
|
+
.catch((err) => {
|
|
737
|
+
// Any throw escaping handleResult on the async-store path (e.g. a
|
|
738
|
+
// rejection from store.get() itself, or a throw in a code path not
|
|
739
|
+
// converged by sendCachedValue) would otherwise surface as an
|
|
740
|
+
// unhandled promise rejection and crash the process. Route it to
|
|
741
|
+
// the handler instead, matching the synchronous store path where
|
|
742
|
+
// the error propagates to the request() call site.
|
|
743
|
+
if (typeof handler.onResponseError === 'function') {
|
|
744
|
+
handler.onResponseError({
|
|
745
|
+
rawHeaders: [],
|
|
746
|
+
rawTrailers: [],
|
|
747
|
+
pause () {},
|
|
748
|
+
resume () {},
|
|
749
|
+
get paused () { return false },
|
|
750
|
+
get aborted () { return false },
|
|
751
|
+
get reason () { return null },
|
|
752
|
+
abort () {}
|
|
753
|
+
}, err)
|
|
754
|
+
} else {
|
|
755
|
+
throw err
|
|
756
|
+
}
|
|
757
|
+
})
|
|
758
|
+
} else {
|
|
759
|
+
return handleResult(
|
|
760
|
+
dispatch,
|
|
761
|
+
globalOpts,
|
|
762
|
+
cacheKey,
|
|
763
|
+
handler,
|
|
764
|
+
opts,
|
|
765
|
+
reqCacheControl,
|
|
766
|
+
result
|
|
767
|
+
)
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|