pixivflow 2.16.0 → 2.16.1
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/dist/package.json +1 -1
- package/dist/version.js +1 -1
- package/dist/webui/package.json +1 -1
- package/node_modules/@redtidev/pixiv-client/LICENSE +21 -0
- package/node_modules/@redtidev/pixiv-client/README.md +103 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.d.ts +6 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.js +14 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.d.ts +30 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.js +137 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/media.d.ts +16 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/media.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/media.js +25 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/media.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.d.ts +43 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.js +250 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/options.d.ts +42 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/options.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/options.js +7 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/options.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.d.ts +9 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.js +22 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/users.d.ts +17 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/users.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/users.js +23 -0
- package/node_modules/@redtidev/pixiv-client/dist/app-api/users.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/auth/types.d.ts +25 -0
- package/node_modules/@redtidev/pixiv-client/dist/auth/types.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/auth/types.js +24 -0
- package/node_modules/@redtidev/pixiv-client/dist/auth/types.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/client.d.ts +42 -0
- package/node_modules/@redtidev/pixiv-client/dist/client.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/client.js +86 -0
- package/node_modules/@redtidev/pixiv-client/dist/client.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/errors/errors.d.ts +117 -0
- package/node_modules/@redtidev/pixiv-client/dist/errors/errors.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/errors/errors.js +169 -0
- package/node_modules/@redtidev/pixiv-client/dist/errors/errors.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/index.d.ts +25 -0
- package/node_modules/@redtidev/pixiv-client/dist/index.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/index.js +50 -0
- package/node_modules/@redtidev/pixiv-client/dist/index.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/logger.d.ts +13 -0
- package/node_modules/@redtidev/pixiv-client/dist/logger.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/logger.js +10 -0
- package/node_modules/@redtidev/pixiv-client/dist/logger.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/models/index.d.ts +112 -0
- package/node_modules/@redtidev/pixiv-client/dist/models/index.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/models/index.js +8 -0
- package/node_modules/@redtidev/pixiv-client/dist/models/index.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/pagination.d.ts +22 -0
- package/node_modules/@redtidev/pixiv-client/dist/pagination.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/pagination.js +41 -0
- package/node_modules/@redtidev/pixiv-client/dist/pagination.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.d.ts +95 -0
- package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.js +344 -0
- package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/transport/transport.d.ts +65 -0
- package/node_modules/@redtidev/pixiv-client/dist/transport/transport.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/transport/transport.js +410 -0
- package/node_modules/@redtidev/pixiv-client/dist/transport/transport.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/types.d.ts +186 -0
- package/node_modules/@redtidev/pixiv-client/dist/types.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/types.js +3 -0
- package/node_modules/@redtidev/pixiv-client/dist/types.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/web-api/types.d.ts +19 -0
- package/node_modules/@redtidev/pixiv-client/dist/web-api/types.d.ts.map +1 -0
- package/node_modules/@redtidev/pixiv-client/dist/web-api/types.js +3 -0
- package/node_modules/@redtidev/pixiv-client/dist/web-api/types.js.map +1 -0
- package/node_modules/@redtidev/pixiv-client/package.json +55 -0
- package/node_modules/@redtidev/pixiv-client/src/__tests__/independence.test.ts +75 -0
- package/node_modules/@redtidev/pixiv-client/src/__tests__/integration.test.ts +268 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/__tests__/services.test.ts +199 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/exports.ts +5 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/illustrations.ts +144 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/media.ts +20 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/novels.ts +269 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/options.ts +73 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/tags.ts +21 -0
- package/node_modules/@redtidev/pixiv-client/src/app-api/users.ts +22 -0
- package/node_modules/@redtidev/pixiv-client/src/auth/types.ts +33 -0
- package/node_modules/@redtidev/pixiv-client/src/client.ts +105 -0
- package/node_modules/@redtidev/pixiv-client/src/errors/errors.ts +180 -0
- package/node_modules/@redtidev/pixiv-client/src/index.ts +91 -0
- package/node_modules/@redtidev/pixiv-client/src/logger.ts +18 -0
- package/node_modules/@redtidev/pixiv-client/src/models/index.ts +117 -0
- package/node_modules/@redtidev/pixiv-client/src/pagination.ts +46 -0
- package/node_modules/@redtidev/pixiv-client/src/rate-limit/RateLimitGate.ts +365 -0
- package/node_modules/@redtidev/pixiv-client/src/rate-limit/__tests__/RateLimitGate.test.ts +258 -0
- package/node_modules/@redtidev/pixiv-client/src/transport/__tests__/transport.test.ts +282 -0
- package/node_modules/@redtidev/pixiv-client/src/transport/transport.ts +500 -0
- package/node_modules/@redtidev/pixiv-client/src/types.ts +168 -0
- package/node_modules/@redtidev/pixiv-client/src/web-api/types.ts +19 -0
- package/node_modules/agent-base/LICENSE +22 -0
- package/node_modules/agent-base/README.md +69 -0
- package/node_modules/agent-base/dist/helpers.d.ts +15 -0
- package/node_modules/agent-base/dist/helpers.d.ts.map +1 -0
- package/node_modules/agent-base/dist/helpers.js +66 -0
- package/node_modules/agent-base/dist/helpers.js.map +1 -0
- package/node_modules/agent-base/dist/index.d.ts +41 -0
- package/node_modules/agent-base/dist/index.d.ts.map +1 -0
- package/node_modules/agent-base/dist/index.js +178 -0
- package/node_modules/agent-base/dist/index.js.map +1 -0
- package/node_modules/agent-base/package.json +46 -0
- package/node_modules/asynckit/LICENSE +21 -0
- package/node_modules/asynckit/README.md +233 -0
- package/node_modules/asynckit/bench.js +76 -0
- package/node_modules/asynckit/index.js +6 -0
- package/node_modules/asynckit/lib/abort.js +29 -0
- package/node_modules/asynckit/lib/async.js +34 -0
- package/node_modules/asynckit/lib/defer.js +26 -0
- package/node_modules/asynckit/lib/iterate.js +75 -0
- package/node_modules/asynckit/lib/readable_asynckit.js +91 -0
- package/node_modules/asynckit/lib/readable_parallel.js +25 -0
- package/node_modules/asynckit/lib/readable_serial.js +25 -0
- package/node_modules/asynckit/lib/readable_serial_ordered.js +29 -0
- package/node_modules/asynckit/lib/state.js +37 -0
- package/node_modules/asynckit/lib/streamify.js +141 -0
- package/node_modules/asynckit/lib/terminator.js +29 -0
- package/node_modules/asynckit/package.json +63 -0
- package/node_modules/asynckit/parallel.js +43 -0
- package/node_modules/asynckit/serial.js +17 -0
- package/node_modules/asynckit/serialOrdered.js +75 -0
- package/node_modules/asynckit/stream.js +21 -0
- package/node_modules/axios/CHANGELOG.md +1934 -0
- package/node_modules/axios/LICENSE +7 -0
- package/node_modules/axios/MIGRATION_GUIDE.md +877 -0
- package/node_modules/axios/README.md +2851 -0
- package/node_modules/axios/dist/axios.js +5807 -0
- package/node_modules/axios/dist/axios.min.js +5 -0
- package/node_modules/axios/dist/axios.min.js.map +1 -0
- package/node_modules/axios/dist/browser/axios.cjs +5829 -0
- package/node_modules/axios/dist/esm/axios.js +5850 -0
- package/node_modules/axios/dist/esm/axios.min.js +3 -0
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -0
- package/node_modules/axios/dist/node/axios.cjs +6808 -0
- package/node_modules/axios/index.d.cts +766 -0
- package/node_modules/axios/index.d.ts +787 -0
- package/node_modules/axios/index.js +45 -0
- package/node_modules/axios/lib/adapters/README.md +36 -0
- package/node_modules/axios/lib/adapters/adapters.js +132 -0
- package/node_modules/axios/lib/adapters/fetch.js +696 -0
- package/node_modules/axios/lib/adapters/http.js +1490 -0
- package/node_modules/axios/lib/adapters/xhr.js +277 -0
- package/node_modules/axios/lib/axios.js +89 -0
- package/node_modules/axios/lib/cancel/CancelToken.js +135 -0
- package/node_modules/axios/lib/cancel/CanceledError.js +22 -0
- package/node_modules/axios/lib/cancel/isCancel.js +5 -0
- package/node_modules/axios/lib/core/Axios.js +306 -0
- package/node_modules/axios/lib/core/AxiosError.js +219 -0
- package/node_modules/axios/lib/core/AxiosHeaders.js +474 -0
- package/node_modules/axios/lib/core/InterceptorManager.js +171 -0
- package/node_modules/axios/lib/core/README.md +8 -0
- package/node_modules/axios/lib/core/buildFullPath.js +76 -0
- package/node_modules/axios/lib/core/dispatchRequest.js +95 -0
- package/node_modules/axios/lib/core/mergeConfig.js +174 -0
- package/node_modules/axios/lib/core/methodList.js +17 -0
- package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
- package/node_modules/axios/lib/core/settle.js +27 -0
- package/node_modules/axios/lib/core/transformData.js +28 -0
- package/node_modules/axios/lib/defaults/index.js +178 -0
- package/node_modules/axios/lib/defaults/transitional.js +10 -0
- package/node_modules/axios/lib/env/README.md +3 -0
- package/node_modules/axios/lib/env/classes/FormData.js +2 -0
- package/node_modules/axios/lib/env/data.js +1 -0
- package/node_modules/axios/lib/helpers/AxiosTransformStream.js +156 -0
- package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
- package/node_modules/axios/lib/helpers/Http2Sessions.js +121 -0
- package/node_modules/axios/lib/helpers/HttpStatusCode.js +88 -0
- package/node_modules/axios/lib/helpers/README.md +7 -0
- package/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
- package/node_modules/axios/lib/helpers/bind.js +14 -0
- package/node_modules/axios/lib/helpers/buildURL.js +69 -0
- package/node_modules/axios/lib/helpers/callbackify.js +18 -0
- package/node_modules/axios/lib/helpers/combineURLs.js +23 -0
- package/node_modules/axios/lib/helpers/composeSignals.js +68 -0
- package/node_modules/axios/lib/helpers/cookies.js +64 -0
- package/node_modules/axios/lib/helpers/deprecatedMethod.js +31 -0
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +166 -0
- package/node_modules/axios/lib/helpers/formDataToJSON.js +125 -0
- package/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
- package/node_modules/axios/lib/helpers/fromDataURI.js +69 -0
- package/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
- package/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
- package/node_modules/axios/lib/helpers/isURLSameOrigin.js +16 -0
- package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
- package/node_modules/axios/lib/helpers/null.js +2 -0
- package/node_modules/axios/lib/helpers/parseHeaders.js +71 -0
- package/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
- package/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
- package/node_modules/axios/lib/helpers/readBlob.js +15 -0
- package/node_modules/axios/lib/helpers/resolveConfig.js +107 -0
- package/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
- package/node_modules/axios/lib/helpers/shouldBypassProxy.js +505 -0
- package/node_modules/axios/lib/helpers/speedometer.js +55 -0
- package/node_modules/axios/lib/helpers/spread.js +28 -0
- package/node_modules/axios/lib/helpers/throttle.js +45 -0
- package/node_modules/axios/lib/helpers/toFormData.js +279 -0
- package/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
- package/node_modules/axios/lib/helpers/trackStream.js +89 -0
- package/node_modules/axios/lib/helpers/validator.js +112 -0
- package/node_modules/axios/lib/platform/browser/classes/Blob.js +3 -0
- package/node_modules/axios/lib/platform/browser/classes/FormData.js +3 -0
- package/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +4 -0
- package/node_modules/axios/lib/platform/browser/index.js +13 -0
- package/node_modules/axios/lib/platform/common/utils.js +52 -0
- package/node_modules/axios/lib/platform/index.js +7 -0
- package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
- package/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
- package/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
- package/node_modules/axios/lib/platform/node/index.js +37 -0
- package/node_modules/axios/lib/utils.js +1150 -0
- package/node_modules/axios/node_modules/agent-base/README.md +145 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.d.ts +78 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.js +203 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/index.js.map +1 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.d.ts +4 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js +18 -0
- package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js.map +1 -0
- package/node_modules/axios/node_modules/agent-base/package.json +64 -0
- package/node_modules/axios/node_modules/agent-base/src/index.ts +345 -0
- package/node_modules/axios/node_modules/agent-base/src/promisify.ts +33 -0
- package/node_modules/axios/node_modules/debug/LICENSE +20 -0
- package/node_modules/axios/node_modules/debug/README.md +481 -0
- package/node_modules/axios/node_modules/debug/package.json +64 -0
- package/node_modules/axios/node_modules/debug/src/browser.js +272 -0
- package/node_modules/axios/node_modules/debug/src/common.js +292 -0
- package/node_modules/axios/node_modules/debug/src/index.js +10 -0
- package/node_modules/axios/node_modules/debug/src/node.js +263 -0
- package/node_modules/axios/node_modules/https-proxy-agent/README.md +137 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.d.ts +30 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js +177 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.d.ts +23 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js +14 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
- package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
- package/node_modules/axios/node_modules/https-proxy-agent/package.json +56 -0
- package/node_modules/axios/node_modules/ms/index.js +162 -0
- package/node_modules/axios/node_modules/ms/license.md +21 -0
- package/node_modules/axios/node_modules/ms/package.json +38 -0
- package/node_modules/axios/node_modules/ms/readme.md +59 -0
- package/node_modules/axios/package.json +203 -0
- package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- package/node_modules/call-bind-apply-helpers/README.md +62 -0
- package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- package/node_modules/call-bind-apply-helpers/index.js +15 -0
- package/node_modules/call-bind-apply-helpers/package.json +85 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- package/node_modules/combined-stream/License +19 -0
- package/node_modules/combined-stream/Readme.md +138 -0
- package/node_modules/combined-stream/lib/combined_stream.js +208 -0
- package/node_modules/combined-stream/package.json +25 -0
- package/node_modules/delayed-stream/.npmignore +1 -0
- package/node_modules/delayed-stream/License +19 -0
- package/node_modules/delayed-stream/Makefile +7 -0
- package/node_modules/delayed-stream/Readme.md +141 -0
- package/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
- package/node_modules/delayed-stream/package.json +27 -0
- package/node_modules/dunder-proto/.eslintrc +5 -0
- package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- package/node_modules/dunder-proto/.nycrc +13 -0
- package/node_modules/dunder-proto/CHANGELOG.md +24 -0
- package/node_modules/dunder-proto/LICENSE +21 -0
- package/node_modules/dunder-proto/README.md +54 -0
- package/node_modules/dunder-proto/get.d.ts +5 -0
- package/node_modules/dunder-proto/get.js +30 -0
- package/node_modules/dunder-proto/package.json +76 -0
- package/node_modules/dunder-proto/set.d.ts +5 -0
- package/node_modules/dunder-proto/set.js +35 -0
- package/node_modules/dunder-proto/test/get.js +34 -0
- package/node_modules/dunder-proto/test/index.js +4 -0
- package/node_modules/dunder-proto/test/set.js +50 -0
- package/node_modules/dunder-proto/tsconfig.json +9 -0
- package/node_modules/es-define-property/.eslintrc +13 -0
- package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- package/node_modules/es-define-property/.nycrc +9 -0
- package/node_modules/es-define-property/CHANGELOG.md +29 -0
- package/node_modules/es-define-property/LICENSE +21 -0
- package/node_modules/es-define-property/README.md +49 -0
- package/node_modules/es-define-property/index.d.ts +3 -0
- package/node_modules/es-define-property/index.js +14 -0
- package/node_modules/es-define-property/package.json +81 -0
- package/node_modules/es-define-property/test/index.js +56 -0
- package/node_modules/es-define-property/tsconfig.json +10 -0
- package/node_modules/es-errors/.eslintrc +5 -0
- package/node_modules/es-errors/.github/FUNDING.yml +12 -0
- package/node_modules/es-errors/CHANGELOG.md +40 -0
- package/node_modules/es-errors/LICENSE +21 -0
- package/node_modules/es-errors/README.md +55 -0
- package/node_modules/es-errors/eval.d.ts +3 -0
- package/node_modules/es-errors/eval.js +4 -0
- package/node_modules/es-errors/index.d.ts +3 -0
- package/node_modules/es-errors/index.js +4 -0
- package/node_modules/es-errors/package.json +80 -0
- package/node_modules/es-errors/range.d.ts +3 -0
- package/node_modules/es-errors/range.js +4 -0
- package/node_modules/es-errors/ref.d.ts +3 -0
- package/node_modules/es-errors/ref.js +4 -0
- package/node_modules/es-errors/syntax.d.ts +3 -0
- package/node_modules/es-errors/syntax.js +4 -0
- package/node_modules/es-errors/test/index.js +19 -0
- package/node_modules/es-errors/tsconfig.json +49 -0
- package/node_modules/es-errors/type.d.ts +3 -0
- package/node_modules/es-errors/type.js +4 -0
- package/node_modules/es-errors/uri.d.ts +3 -0
- package/node_modules/es-errors/uri.js +4 -0
- package/node_modules/es-object-atoms/.eslintrc +16 -0
- package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- package/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- package/node_modules/es-object-atoms/LICENSE +21 -0
- package/node_modules/es-object-atoms/README.md +63 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- package/node_modules/es-object-atoms/ToObject.js +10 -0
- package/node_modules/es-object-atoms/index.d.ts +3 -0
- package/node_modules/es-object-atoms/index.js +4 -0
- package/node_modules/es-object-atoms/isObject.d.ts +3 -0
- package/node_modules/es-object-atoms/isObject.js +6 -0
- package/node_modules/es-object-atoms/package.json +80 -0
- package/node_modules/es-object-atoms/test/index.js +38 -0
- package/node_modules/es-object-atoms/tsconfig.json +6 -0
- package/node_modules/es-set-tostringtag/.eslintrc +13 -0
- package/node_modules/es-set-tostringtag/.nycrc +9 -0
- package/node_modules/es-set-tostringtag/CHANGELOG.md +67 -0
- package/node_modules/es-set-tostringtag/LICENSE +21 -0
- package/node_modules/es-set-tostringtag/README.md +53 -0
- package/node_modules/es-set-tostringtag/index.d.ts +10 -0
- package/node_modules/es-set-tostringtag/index.js +35 -0
- package/node_modules/es-set-tostringtag/package.json +78 -0
- package/node_modules/es-set-tostringtag/test/index.js +85 -0
- package/node_modules/es-set-tostringtag/tsconfig.json +9 -0
- package/node_modules/follow-redirects/LICENSE +18 -0
- package/node_modules/follow-redirects/README.md +157 -0
- package/node_modules/follow-redirects/debug.js +15 -0
- package/node_modules/follow-redirects/http.js +1 -0
- package/node_modules/follow-redirects/https.js +1 -0
- package/node_modules/follow-redirects/index.js +709 -0
- package/node_modules/follow-redirects/package.json +58 -0
- package/node_modules/form-data/CHANGELOG.md +686 -0
- package/node_modules/form-data/License +19 -0
- package/node_modules/form-data/README.md +355 -0
- package/node_modules/form-data/index.d.ts +62 -0
- package/node_modules/form-data/lib/browser.js +4 -0
- package/node_modules/form-data/lib/form_data.js +506 -0
- package/node_modules/form-data/lib/populate.js +10 -0
- package/node_modules/form-data/package.json +82 -0
- package/node_modules/function-bind/.eslintrc +21 -0
- package/node_modules/function-bind/.github/FUNDING.yml +12 -0
- package/node_modules/function-bind/.github/SECURITY.md +3 -0
- package/node_modules/function-bind/.nycrc +13 -0
- package/node_modules/function-bind/CHANGELOG.md +136 -0
- package/node_modules/function-bind/LICENSE +20 -0
- package/node_modules/function-bind/README.md +46 -0
- package/node_modules/function-bind/implementation.js +84 -0
- package/node_modules/function-bind/index.js +5 -0
- package/node_modules/function-bind/package.json +87 -0
- package/node_modules/function-bind/test/.eslintrc +9 -0
- package/node_modules/function-bind/test/index.js +252 -0
- package/node_modules/get-intrinsic/.eslintrc +42 -0
- package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/node_modules/get-intrinsic/.nycrc +9 -0
- package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- package/node_modules/get-intrinsic/LICENSE +21 -0
- package/node_modules/get-intrinsic/README.md +71 -0
- package/node_modules/get-intrinsic/index.js +378 -0
- package/node_modules/get-intrinsic/package.json +97 -0
- package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- package/node_modules/get-proto/.eslintrc +10 -0
- package/node_modules/get-proto/.github/FUNDING.yml +12 -0
- package/node_modules/get-proto/.nycrc +9 -0
- package/node_modules/get-proto/CHANGELOG.md +21 -0
- package/node_modules/get-proto/LICENSE +21 -0
- package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- package/node_modules/get-proto/README.md +50 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- package/node_modules/get-proto/index.d.ts +5 -0
- package/node_modules/get-proto/index.js +27 -0
- package/node_modules/get-proto/package.json +81 -0
- package/node_modules/get-proto/test/index.js +68 -0
- package/node_modules/get-proto/tsconfig.json +9 -0
- package/node_modules/gopd/.eslintrc +16 -0
- package/node_modules/gopd/.github/FUNDING.yml +12 -0
- package/node_modules/gopd/CHANGELOG.md +45 -0
- package/node_modules/gopd/LICENSE +21 -0
- package/node_modules/gopd/README.md +40 -0
- package/node_modules/gopd/gOPD.d.ts +1 -0
- package/node_modules/gopd/gOPD.js +4 -0
- package/node_modules/gopd/index.d.ts +5 -0
- package/node_modules/gopd/index.js +15 -0
- package/node_modules/gopd/package.json +77 -0
- package/node_modules/gopd/test/index.js +36 -0
- package/node_modules/gopd/tsconfig.json +9 -0
- package/node_modules/has-symbols/.eslintrc +11 -0
- package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/node_modules/has-symbols/.nycrc +9 -0
- package/node_modules/has-symbols/CHANGELOG.md +91 -0
- package/node_modules/has-symbols/LICENSE +21 -0
- package/node_modules/has-symbols/README.md +46 -0
- package/node_modules/has-symbols/index.d.ts +3 -0
- package/node_modules/has-symbols/index.js +14 -0
- package/node_modules/has-symbols/package.json +111 -0
- package/node_modules/has-symbols/shams.d.ts +3 -0
- package/node_modules/has-symbols/shams.js +45 -0
- package/node_modules/has-symbols/test/index.js +22 -0
- package/node_modules/has-symbols/test/shams/core-js.js +29 -0
- package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- package/node_modules/has-symbols/test/tests.js +58 -0
- package/node_modules/has-symbols/tsconfig.json +10 -0
- package/node_modules/has-tostringtag/.eslintrc +5 -0
- package/node_modules/has-tostringtag/.github/FUNDING.yml +12 -0
- package/node_modules/has-tostringtag/.nycrc +13 -0
- package/node_modules/has-tostringtag/CHANGELOG.md +42 -0
- package/node_modules/has-tostringtag/LICENSE +21 -0
- package/node_modules/has-tostringtag/README.md +46 -0
- package/node_modules/has-tostringtag/index.d.ts +3 -0
- package/node_modules/has-tostringtag/index.js +8 -0
- package/node_modules/has-tostringtag/package.json +108 -0
- package/node_modules/has-tostringtag/shams.d.ts +3 -0
- package/node_modules/has-tostringtag/shams.js +8 -0
- package/node_modules/has-tostringtag/test/index.js +21 -0
- package/node_modules/has-tostringtag/test/shams/core-js.js +31 -0
- package/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +30 -0
- package/node_modules/has-tostringtag/test/tests.js +15 -0
- package/node_modules/has-tostringtag/tsconfig.json +49 -0
- package/node_modules/hasown/.github/FUNDING.yml +12 -0
- package/node_modules/hasown/.nycrc +13 -0
- package/node_modules/hasown/CHANGELOG.md +58 -0
- package/node_modules/hasown/LICENSE +21 -0
- package/node_modules/hasown/README.md +40 -0
- package/node_modules/hasown/eslint.config.mjs +6 -0
- package/node_modules/hasown/index.d.ts +3 -0
- package/node_modules/hasown/index.js +8 -0
- package/node_modules/hasown/package.json +91 -0
- package/node_modules/hasown/tsconfig.json +6 -0
- package/node_modules/ip-address/LICENSE +19 -0
- package/node_modules/ip-address/README.md +308 -0
- package/node_modules/ip-address/dist/address-error.d.ts +15 -0
- package/node_modules/ip-address/dist/address-error.js +12 -0
- package/node_modules/ip-address/dist/address-error.js.map +1 -0
- package/node_modules/ip-address/dist/common.d.ts +69 -0
- package/node_modules/ip-address/dist/common.js +142 -0
- package/node_modules/ip-address/dist/common.js.map +1 -0
- package/node_modules/ip-address/dist/ip-address.d.ts +7 -0
- package/node_modules/ip-address/dist/ip-address.js +35 -0
- package/node_modules/ip-address/dist/ip-address.js.map +1 -0
- package/node_modules/ip-address/dist/ipv4.d.ts +340 -0
- package/node_modules/ip-address/dist/ipv4.js +580 -0
- package/node_modules/ip-address/dist/ipv4.js.map +1 -0
- package/node_modules/ip-address/dist/ipv6.d.ts +630 -0
- package/node_modules/ip-address/dist/ipv6.js +1443 -0
- package/node_modules/ip-address/dist/ipv6.js.map +1 -0
- package/node_modules/ip-address/dist/v4/constants.d.ts +16 -0
- package/node_modules/ip-address/dist/v4/constants.js +51 -0
- package/node_modules/ip-address/dist/v4/constants.js.map +1 -0
- package/node_modules/ip-address/dist/v6/constants.d.ts +58 -0
- package/node_modules/ip-address/dist/v6/constants.js +128 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -0
- package/node_modules/ip-address/dist/v6/helpers.d.ts +18 -0
- package/node_modules/ip-address/dist/v6/helpers.js +54 -0
- package/node_modules/ip-address/dist/v6/helpers.js.map +1 -0
- package/node_modules/ip-address/dist/v6/regular-expressions.d.ts +5 -0
- package/node_modules/ip-address/dist/v6/regular-expressions.js +95 -0
- package/node_modules/ip-address/dist/v6/regular-expressions.js.map +1 -0
- package/node_modules/ip-address/package.json +90 -0
- package/node_modules/math-intrinsics/.eslintrc +16 -0
- package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- package/node_modules/math-intrinsics/LICENSE +21 -0
- package/node_modules/math-intrinsics/README.md +50 -0
- package/node_modules/math-intrinsics/abs.d.ts +1 -0
- package/node_modules/math-intrinsics/abs.js +4 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- package/node_modules/math-intrinsics/floor.d.ts +1 -0
- package/node_modules/math-intrinsics/floor.js +4 -0
- package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- package/node_modules/math-intrinsics/isFinite.js +12 -0
- package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/isInteger.js +16 -0
- package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- package/node_modules/math-intrinsics/isNaN.js +6 -0
- package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- package/node_modules/math-intrinsics/max.d.ts +1 -0
- package/node_modules/math-intrinsics/max.js +4 -0
- package/node_modules/math-intrinsics/min.d.ts +1 -0
- package/node_modules/math-intrinsics/min.js +4 -0
- package/node_modules/math-intrinsics/mod.d.ts +3 -0
- package/node_modules/math-intrinsics/mod.js +9 -0
- package/node_modules/math-intrinsics/package.json +86 -0
- package/node_modules/math-intrinsics/pow.d.ts +1 -0
- package/node_modules/math-intrinsics/pow.js +4 -0
- package/node_modules/math-intrinsics/round.d.ts +1 -0
- package/node_modules/math-intrinsics/round.js +4 -0
- package/node_modules/math-intrinsics/sign.d.ts +3 -0
- package/node_modules/math-intrinsics/sign.js +11 -0
- package/node_modules/math-intrinsics/test/index.js +192 -0
- package/node_modules/math-intrinsics/tsconfig.json +3 -0
- package/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-db/package.json +60 -0
- package/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/mime-types/README.md +113 -0
- package/node_modules/mime-types/index.js +188 -0
- package/node_modules/mime-types/package.json +44 -0
- package/node_modules/proxy-from-env/LICENSE +20 -0
- package/node_modules/proxy-from-env/README.md +163 -0
- package/node_modules/proxy-from-env/index.cjs +105 -0
- package/node_modules/proxy-from-env/index.js +103 -0
- package/node_modules/proxy-from-env/package.json +43 -0
- package/node_modules/smart-buffer/.prettierrc.yaml +5 -0
- package/node_modules/smart-buffer/.travis.yml +13 -0
- package/node_modules/smart-buffer/LICENSE +20 -0
- package/node_modules/smart-buffer/README.md +633 -0
- package/node_modules/smart-buffer/build/smartbuffer.js +1233 -0
- package/node_modules/smart-buffer/build/smartbuffer.js.map +1 -0
- package/node_modules/smart-buffer/build/utils.js +108 -0
- package/node_modules/smart-buffer/build/utils.js.map +1 -0
- package/node_modules/smart-buffer/docs/CHANGELOG.md +70 -0
- package/node_modules/smart-buffer/docs/README_v3.md +367 -0
- package/node_modules/smart-buffer/docs/ROADMAP.md +0 -0
- package/node_modules/smart-buffer/package.json +79 -0
- package/node_modules/smart-buffer/typings/smartbuffer.d.ts +755 -0
- package/node_modules/smart-buffer/typings/utils.d.ts +66 -0
- package/node_modules/socks/.eslintrc.cjs +11 -0
- package/node_modules/socks/.prettierrc.yaml +7 -0
- package/node_modules/socks/LICENSE +20 -0
- package/node_modules/socks/README.md +686 -0
- package/node_modules/socks/build/client/socksclient.js +793 -0
- package/node_modules/socks/build/client/socksclient.js.map +1 -0
- package/node_modules/socks/build/common/constants.js +108 -0
- package/node_modules/socks/build/common/constants.js.map +1 -0
- package/node_modules/socks/build/common/helpers.js +167 -0
- package/node_modules/socks/build/common/helpers.js.map +1 -0
- package/node_modules/socks/build/common/receivebuffer.js +43 -0
- package/node_modules/socks/build/common/receivebuffer.js.map +1 -0
- package/node_modules/socks/build/common/util.js +25 -0
- package/node_modules/socks/build/common/util.js.map +1 -0
- package/node_modules/socks/build/index.js +18 -0
- package/node_modules/socks/build/index.js.map +1 -0
- package/node_modules/socks/docs/examples/index.md +17 -0
- package/node_modules/socks/docs/examples/javascript/associateExample.md +90 -0
- package/node_modules/socks/docs/examples/javascript/bindExample.md +83 -0
- package/node_modules/socks/docs/examples/javascript/connectExample.md +258 -0
- package/node_modules/socks/docs/examples/typescript/associateExample.md +93 -0
- package/node_modules/socks/docs/examples/typescript/bindExample.md +86 -0
- package/node_modules/socks/docs/examples/typescript/connectExample.md +265 -0
- package/node_modules/socks/docs/index.md +5 -0
- package/node_modules/socks/docs/migratingFromV1.md +86 -0
- package/node_modules/socks/package.json +58 -0
- package/node_modules/socks/typings/client/socksclient.d.ts +162 -0
- package/node_modules/socks/typings/common/constants.d.ts +151 -0
- package/node_modules/socks/typings/common/helpers.d.ts +17 -0
- package/node_modules/socks/typings/common/receivebuffer.d.ts +12 -0
- package/node_modules/socks/typings/common/util.d.ts +14 -0
- package/node_modules/socks/typings/index.d.ts +1 -0
- package/node_modules/socks-proxy-agent/LICENSE +22 -0
- package/node_modules/socks-proxy-agent/README.md +50 -0
- package/node_modules/socks-proxy-agent/dist/index.d.ts +27 -0
- package/node_modules/socks-proxy-agent/dist/index.d.ts.map +1 -0
- package/node_modules/socks-proxy-agent/dist/index.js +195 -0
- package/node_modules/socks-proxy-agent/dist/index.js.map +1 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/LICENSE +20 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/README.md +481 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/package.json +64 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/src/browser.js +272 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/src/common.js +292 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/src/index.js +10 -0
- package/node_modules/socks-proxy-agent/node_modules/debug/src/node.js +263 -0
- package/node_modules/socks-proxy-agent/node_modules/ms/index.js +162 -0
- package/node_modules/socks-proxy-agent/node_modules/ms/license.md +21 -0
- package/node_modules/socks-proxy-agent/node_modules/ms/package.json +38 -0
- package/node_modules/socks-proxy-agent/node_modules/ms/readme.md +59 -0
- package/node_modules/socks-proxy-agent/package.json +142 -0
- package/node_modules/undici/LICENSE +21 -0
- package/node_modules/undici/README.md +473 -0
- package/node_modules/undici/docs/docs/api/Agent.md +80 -0
- package/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
- package/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
- package/node_modules/undici/docs/docs/api/Client.md +277 -0
- package/node_modules/undici/docs/docs/api/Connector.md +115 -0
- package/node_modules/undici/docs/docs/api/ContentType.md +57 -0
- package/node_modules/undici/docs/docs/api/Cookies.md +101 -0
- package/node_modules/undici/docs/docs/api/Debug.md +62 -0
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +204 -0
- package/node_modules/undici/docs/docs/api/DispatchInterceptor.md +60 -0
- package/node_modules/undici/docs/docs/api/Dispatcher.md +1347 -0
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +162 -0
- package/node_modules/undici/docs/docs/api/Errors.md +49 -0
- package/node_modules/undici/docs/docs/api/EventSource.md +45 -0
- package/node_modules/undici/docs/docs/api/Fetch.md +52 -0
- package/node_modules/undici/docs/docs/api/MockAgent.md +540 -0
- package/node_modules/undici/docs/docs/api/MockClient.md +77 -0
- package/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
- package/node_modules/undici/docs/docs/api/MockPool.md +547 -0
- package/node_modules/undici/docs/docs/api/Pool.md +84 -0
- package/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +131 -0
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +96 -0
- package/node_modules/undici/docs/docs/api/RetryAgent.md +45 -0
- package/node_modules/undici/docs/docs/api/RetryHandler.md +117 -0
- package/node_modules/undici/docs/docs/api/Util.md +25 -0
- package/node_modules/undici/docs/docs/api/WebSocket.md +51 -0
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +136 -0
- package/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +20 -0
- package/node_modules/undici/index-fetch.js +35 -0
- package/node_modules/undici/index.d.ts +3 -0
- package/node_modules/undici/index.js +169 -0
- package/node_modules/undici/lib/api/abort-signal.js +57 -0
- package/node_modules/undici/lib/api/api-connect.js +108 -0
- package/node_modules/undici/lib/api/api-pipeline.js +251 -0
- package/node_modules/undici/lib/api/api-request.js +214 -0
- package/node_modules/undici/lib/api/api-stream.js +220 -0
- package/node_modules/undici/lib/api/api-upgrade.js +108 -0
- package/node_modules/undici/lib/api/index.js +7 -0
- package/node_modules/undici/lib/api/readable.js +385 -0
- package/node_modules/undici/lib/api/util.js +93 -0
- package/node_modules/undici/lib/core/connect.js +240 -0
- package/node_modules/undici/lib/core/constants.js +118 -0
- package/node_modules/undici/lib/core/diagnostics.js +202 -0
- package/node_modules/undici/lib/core/errors.js +425 -0
- package/node_modules/undici/lib/core/request.js +416 -0
- package/node_modules/undici/lib/core/symbols.js +67 -0
- package/node_modules/undici/lib/core/tree.js +152 -0
- package/node_modules/undici/lib/core/util.js +719 -0
- package/node_modules/undici/lib/dispatcher/agent.js +129 -0
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +209 -0
- package/node_modules/undici/lib/dispatcher/client-h1.js +1496 -0
- package/node_modules/undici/lib/dispatcher/client-h2.js +744 -0
- package/node_modules/undici/lib/dispatcher/client.js +623 -0
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +199 -0
- package/node_modules/undici/lib/dispatcher/dispatcher.js +65 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +160 -0
- package/node_modules/undici/lib/dispatcher/fixed-queue.js +117 -0
- package/node_modules/undici/lib/dispatcher/pool-base.js +194 -0
- package/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
- package/node_modules/undici/lib/dispatcher/pool.js +107 -0
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +274 -0
- package/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
- package/node_modules/undici/lib/global.js +32 -0
- package/node_modules/undici/lib/handler/decorator-handler.js +44 -0
- package/node_modules/undici/lib/handler/redirect-handler.js +232 -0
- package/node_modules/undici/lib/handler/retry-handler.js +408 -0
- package/node_modules/undici/lib/interceptor/dns.js +375 -0
- package/node_modules/undici/lib/interceptor/dump.js +123 -0
- package/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
- package/node_modules/undici/lib/interceptor/redirect.js +24 -0
- package/node_modules/undici/lib/interceptor/response-error.js +86 -0
- package/node_modules/undici/lib/interceptor/retry.js +19 -0
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/llhttp/constants.js +278 -0
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +5 -0
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +5 -0
- package/node_modules/undici/lib/llhttp/utils.js +15 -0
- package/node_modules/undici/lib/mock/mock-agent.js +160 -0
- package/node_modules/undici/lib/mock/mock-client.js +59 -0
- package/node_modules/undici/lib/mock/mock-errors.js +28 -0
- package/node_modules/undici/lib/mock/mock-interceptor.js +207 -0
- package/node_modules/undici/lib/mock/mock-pool.js +59 -0
- package/node_modules/undici/lib/mock/mock-symbols.js +23 -0
- package/node_modules/undici/lib/mock/mock-utils.js +367 -0
- package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
- package/node_modules/undici/lib/mock/pluralizer.js +29 -0
- package/node_modules/undici/lib/util/timers.js +423 -0
- package/node_modules/undici/lib/web/cache/cache.js +859 -0
- package/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
- package/node_modules/undici/lib/web/cache/symbols.js +5 -0
- package/node_modules/undici/lib/web/cache/util.js +45 -0
- package/node_modules/undici/lib/web/cookies/constants.js +12 -0
- package/node_modules/undici/lib/web/cookies/index.js +184 -0
- package/node_modules/undici/lib/web/cookies/parse.js +310 -0
- package/node_modules/undici/lib/web/cookies/util.js +352 -0
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +398 -0
- package/node_modules/undici/lib/web/eventsource/eventsource.js +480 -0
- package/node_modules/undici/lib/web/eventsource/util.js +37 -0
- package/node_modules/undici/lib/web/fetch/LICENSE +21 -0
- package/node_modules/undici/lib/web/fetch/body.js +529 -0
- package/node_modules/undici/lib/web/fetch/constants.js +124 -0
- package/node_modules/undici/lib/web/fetch/data-url.js +744 -0
- package/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
- package/node_modules/undici/lib/web/fetch/file.js +126 -0
- package/node_modules/undici/lib/web/fetch/formdata-parser.js +474 -0
- package/node_modules/undici/lib/web/fetch/formdata.js +252 -0
- package/node_modules/undici/lib/web/fetch/global.js +40 -0
- package/node_modules/undici/lib/web/fetch/headers.js +687 -0
- package/node_modules/undici/lib/web/fetch/index.js +2272 -0
- package/node_modules/undici/lib/web/fetch/request.js +1037 -0
- package/node_modules/undici/lib/web/fetch/response.js +610 -0
- package/node_modules/undici/lib/web/fetch/symbols.js +9 -0
- package/node_modules/undici/lib/web/fetch/util.js +1632 -0
- package/node_modules/undici/lib/web/fetch/webidl.js +695 -0
- package/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
- package/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
- package/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
- package/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
- package/node_modules/undici/lib/web/fileapi/util.js +391 -0
- package/node_modules/undici/lib/web/websocket/connection.js +371 -0
- package/node_modules/undici/lib/web/websocket/constants.js +66 -0
- package/node_modules/undici/lib/web/websocket/events.js +329 -0
- package/node_modules/undici/lib/web/websocket/frame.js +96 -0
- package/node_modules/undici/lib/web/websocket/permessage-deflate.js +100 -0
- package/node_modules/undici/lib/web/websocket/receiver.js +513 -0
- package/node_modules/undici/lib/web/websocket/sender.js +104 -0
- package/node_modules/undici/lib/web/websocket/symbols.js +12 -0
- package/node_modules/undici/lib/web/websocket/util.js +322 -0
- package/node_modules/undici/lib/web/websocket/websocket.js +595 -0
- package/node_modules/undici/package.json +160 -0
- package/node_modules/undici/scripts/strip-comments.js +8 -0
- package/node_modules/undici/types/README.md +6 -0
- package/node_modules/undici/types/agent.d.ts +31 -0
- package/node_modules/undici/types/api.d.ts +43 -0
- package/node_modules/undici/types/balanced-pool.d.ts +29 -0
- package/node_modules/undici/types/cache.d.ts +36 -0
- package/node_modules/undici/types/client.d.ts +125 -0
- package/node_modules/undici/types/connector.d.ts +34 -0
- package/node_modules/undici/types/content-type.d.ts +21 -0
- package/node_modules/undici/types/cookies.d.ts +28 -0
- package/node_modules/undici/types/diagnostics-channel.d.ts +66 -0
- package/node_modules/undici/types/dispatcher.d.ts +256 -0
- package/node_modules/undici/types/env-http-proxy-agent.d.ts +21 -0
- package/node_modules/undici/types/errors.d.ts +155 -0
- package/node_modules/undici/types/eventsource.d.ts +61 -0
- package/node_modules/undici/types/fetch.d.ts +209 -0
- package/node_modules/undici/types/file.d.ts +39 -0
- package/node_modules/undici/types/filereader.d.ts +54 -0
- package/node_modules/undici/types/formdata.d.ts +108 -0
- package/node_modules/undici/types/global-dispatcher.d.ts +9 -0
- package/node_modules/undici/types/global-origin.d.ts +7 -0
- package/node_modules/undici/types/handlers.d.ts +15 -0
- package/node_modules/undici/types/header.d.ts +4 -0
- package/node_modules/undici/types/index.d.ts +71 -0
- package/node_modules/undici/types/interceptors.d.ts +32 -0
- package/node_modules/undici/types/mock-agent.d.ts +50 -0
- package/node_modules/undici/types/mock-client.d.ts +25 -0
- package/node_modules/undici/types/mock-errors.d.ts +12 -0
- package/node_modules/undici/types/mock-interceptor.d.ts +93 -0
- package/node_modules/undici/types/mock-pool.d.ts +25 -0
- package/node_modules/undici/types/patch.d.ts +33 -0
- package/node_modules/undici/types/pool-stats.d.ts +19 -0
- package/node_modules/undici/types/pool.d.ts +39 -0
- package/node_modules/undici/types/proxy-agent.d.ts +29 -0
- package/node_modules/undici/types/readable.d.ts +65 -0
- package/node_modules/undici/types/retry-agent.d.ts +8 -0
- package/node_modules/undici/types/retry-handler.d.ts +116 -0
- package/node_modules/undici/types/util.d.ts +18 -0
- package/node_modules/undici/types/webidl.d.ts +228 -0
- package/node_modules/undici/types/websocket.d.ts +150 -0
- package/package.json +4 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-api/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-api/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@redtidev/pixiv-client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Independent, reusable Pixiv App-API client kit: typed transport, rate limiting, circuit breaker, pagination and media fetch. Knows Pixiv, knows nothing about the host application.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "redtidev1918",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/redtidev1918/PixivFlow.git",
|
|
10
|
+
"directory": "packages/pixiv-client"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"pixiv",
|
|
14
|
+
"pixiv-api",
|
|
15
|
+
"pixiv-client",
|
|
16
|
+
"api-client",
|
|
17
|
+
"rate-limiting",
|
|
18
|
+
"circuit-breaker",
|
|
19
|
+
"typescript"
|
|
20
|
+
],
|
|
21
|
+
"main": "dist/index.js",
|
|
22
|
+
"types": "dist/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"default": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"src",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p tsconfig.json",
|
|
40
|
+
"test": "jest --runInBand",
|
|
41
|
+
"clean": "rm -rf dist"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"axios": "^1.20.0",
|
|
45
|
+
"socks-proxy-agent": "^8.0.5",
|
|
46
|
+
"undici": "^6.28.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/jest": "^29.5.0",
|
|
50
|
+
"@types/node": "^22.20.1",
|
|
51
|
+
"jest": "^29.7.0",
|
|
52
|
+
"ts-jest": "^29.4.12",
|
|
53
|
+
"typescript": "^5.6.2"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join, resolve, dirname, relative } from 'node:path';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Architectural guard: the kit must stay independent of PixivFlow.
|
|
6
|
+
* The package lives in a workspace but may only depend on its own declared
|
|
7
|
+
* deps; any import reaching into the host product breaks reuse/split-out.
|
|
8
|
+
*/
|
|
9
|
+
describe('kit independence', () => {
|
|
10
|
+
const root = join(__dirname, '..');
|
|
11
|
+
const files: string[] = [];
|
|
12
|
+
const walk = (dir: string) => {
|
|
13
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
14
|
+
if (entry.name === '__tests__' || entry.name === 'node_modules') continue;
|
|
15
|
+
const full = join(dir, entry.name);
|
|
16
|
+
if (entry.isDirectory()) walk(full);
|
|
17
|
+
else if (entry.name.endsWith('.ts')) files.push(full);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const srcRoot = root; // __dirname/.. is src/ under ts-jest
|
|
21
|
+
walk(srcRoot);
|
|
22
|
+
|
|
23
|
+
it('never imports PixivFlow product symbols', () => {
|
|
24
|
+
const forbiddenSubstrings = [
|
|
25
|
+
'TargetConfig',
|
|
26
|
+
'StandaloneConfig',
|
|
27
|
+
'better-sqlite3',
|
|
28
|
+
'puppeteer',
|
|
29
|
+
'playwright',
|
|
30
|
+
];
|
|
31
|
+
const violations: string[] = [];
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const rel = file.replace(root, '.');
|
|
34
|
+
// Strip comments: JSDoc deliberately names forbidden host concepts to
|
|
35
|
+
// document the boundary; the guard is about real code/imports.
|
|
36
|
+
const src = readFileSync(file, 'utf8')
|
|
37
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
38
|
+
.replace(/^\s*\/\/.*$/gm, '');
|
|
39
|
+
for (const banned of forbiddenSubstrings) {
|
|
40
|
+
if (src.includes(banned)) violations.push(`${rel} references ${banned}`);
|
|
41
|
+
}
|
|
42
|
+
for (const m of src.matchAll(/from\s+['"](\.[^'"]*)['"]/g)) {
|
|
43
|
+
const resolved = resolve(dirname(file), m[1]);
|
|
44
|
+
const inside = relative(srcRoot, resolved);
|
|
45
|
+
if (inside.startsWith('..')) {
|
|
46
|
+
violations.push(`${rel} relative import escapes src: ${m[1]}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
expect(violations).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('declares every runtime dependency it imports', () => {
|
|
54
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8')) as {
|
|
55
|
+
dependencies?: Record<string, string>;
|
|
56
|
+
};
|
|
57
|
+
const declared = new Set([...Object.keys(pkg.dependencies ?? {}), ...BUILTINS]);
|
|
58
|
+
const missing = new Set<string>();
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const src = readFileSync(file, 'utf8');
|
|
61
|
+
for (const m of src.matchAll(/from\s+['"]([^'".][^'"]*)['"]/g)) {
|
|
62
|
+
let spec = m[1];
|
|
63
|
+
if (spec.startsWith('node:')) continue; // node builtin
|
|
64
|
+
const name = spec.startsWith('@') ? spec.split('/').slice(0, 2).join('/') : spec.split('/')[0];
|
|
65
|
+
if (!declared.has(name)) missing.add(name);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
expect([...missing]).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const BUILTINS = new Set([
|
|
73
|
+
'crypto', 'events', 'fs', 'http', 'https', 'net', 'os', 'path',
|
|
74
|
+
'stream', 'timers', 'url', 'util', 'zlib',
|
|
75
|
+
]);
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { PixivClient } from '../client';
|
|
2
|
+
import { StaticTokenProvider } from '../auth/types';
|
|
3
|
+
import { MemoryRateLimitStateStore } from '../rate-limit/RateLimitGate';
|
|
4
|
+
import { paginate } from '../pagination';
|
|
5
|
+
import type { FetchLike, RateLimitStateStore } from '../types';
|
|
6
|
+
import {
|
|
7
|
+
PixivCircuitOpenError,
|
|
8
|
+
PixivRateLimitError,
|
|
9
|
+
PixivAbortError,
|
|
10
|
+
} from '../errors/errors';
|
|
11
|
+
|
|
12
|
+
function response(status: number, body: unknown, headers: Record<string, string> = {}) {
|
|
13
|
+
const text = typeof body === 'string' ? body : JSON.stringify(body);
|
|
14
|
+
const map = new Map(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v]));
|
|
15
|
+
return {
|
|
16
|
+
status,
|
|
17
|
+
statusText: '',
|
|
18
|
+
ok: status >= 200 && status < 300,
|
|
19
|
+
headers: { get: (n: string) => map.get(n.toLowerCase()) ?? null },
|
|
20
|
+
json: async () => JSON.parse(text),
|
|
21
|
+
text: async () => text,
|
|
22
|
+
arrayBuffer: async () => new ArrayBuffer(0),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function clientWith(fetchImpl: FetchLike, store?: RateLimitStateStore) {
|
|
27
|
+
return new PixivClient({
|
|
28
|
+
auth: new StaticTokenProvider('t'),
|
|
29
|
+
fetchImpl,
|
|
30
|
+
retries: 0,
|
|
31
|
+
rateLimit: {
|
|
32
|
+
minIntervalMs: 0,
|
|
33
|
+
jitterRatio: 0,
|
|
34
|
+
initialCooldownMs: 1, // tiny: no real-time waiting in tests
|
|
35
|
+
maxCooldownMs: 600_000,
|
|
36
|
+
random: () => 0,
|
|
37
|
+
stateStore: store,
|
|
38
|
+
// No real waiting: gate cooldowns resolve immediately (state still
|
|
39
|
+
// records the full cooldownUntil, which is what restart recovery tests).
|
|
40
|
+
sleep: (ms) => new Promise<void>((resolve) => setTimeout(resolve, 0)),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe('restart recovery', () => {
|
|
46
|
+
it('429 -> cooldown persisted -> new client with same store still blocks', async () => {
|
|
47
|
+
const store = new MemoryRateLimitStateStore();
|
|
48
|
+
let calls = 0;
|
|
49
|
+
const client = clientWith(
|
|
50
|
+
async () => {
|
|
51
|
+
calls++;
|
|
52
|
+
return response(429, { error: 'rate' }, { 'retry-after': '60' });
|
|
53
|
+
},
|
|
54
|
+
store
|
|
55
|
+
);
|
|
56
|
+
await expect(client.illustrations.get(1)).rejects.toBeInstanceOf(PixivRateLimitError);
|
|
57
|
+
|
|
58
|
+
// "Restart": a brand new client, same persisted state.
|
|
59
|
+
let calls2 = 0;
|
|
60
|
+
const client2 = clientWith(async () => {
|
|
61
|
+
calls2++;
|
|
62
|
+
return response(200, { illust: { id: 1 } });
|
|
63
|
+
}, store);
|
|
64
|
+
|
|
65
|
+
const status = await client2.getRateLimitStatus();
|
|
66
|
+
expect(status.cooldownRemainingMs).toBeGreaterThanOrEqual(50_000);
|
|
67
|
+
expect(status.penaltyLevel).toBe(1);
|
|
68
|
+
expect(calls2).toBe(0); // no request attempted before any call
|
|
69
|
+
|
|
70
|
+
// At the persisted cooldown instant the next request is gated (waits);
|
|
71
|
+
// after advancing the clock past it, it goes through without a reset.
|
|
72
|
+
let nowMs = Date.now();
|
|
73
|
+
const client3 = new PixivClient({
|
|
74
|
+
auth: new StaticTokenProvider('t'),
|
|
75
|
+
fetchImpl: async () => {
|
|
76
|
+
calls2++;
|
|
77
|
+
return response(200, { illust: { id: 1 } });
|
|
78
|
+
},
|
|
79
|
+
retries: 0,
|
|
80
|
+
rateLimit: {
|
|
81
|
+
minIntervalMs: 0,
|
|
82
|
+
jitterRatio: 0,
|
|
83
|
+
initialCooldownMs: 1,
|
|
84
|
+
maxCooldownMs: 600_000,
|
|
85
|
+
random: () => 0,
|
|
86
|
+
stateStore: store,
|
|
87
|
+
now: () => nowMs,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
const st = await client3.getRateLimitStatus();
|
|
91
|
+
expect(st.circuitState).toBe('closed');
|
|
92
|
+
expect(st.cooldownRemainingMs).toBeGreaterThan(0);
|
|
93
|
+
// Jump beyond the persisted cooldown: request now succeeds, proving the
|
|
94
|
+
// block came from persisted state, not a fresh clock-zero default.
|
|
95
|
+
nowMs += 120_000;
|
|
96
|
+
expect((await client3.illustrations.get(1)).id).toBe(1);
|
|
97
|
+
expect(calls2).toBe(1);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe('429 queue serialization (fault injection)', () => {
|
|
102
|
+
it('search 429 parks the global gate; after cooldown, queued sends are spaced 1s apart', async () => {
|
|
103
|
+
// Deterministic virtual clock: sleeps resolve in fake-time order and the
|
|
104
|
+
// event loop drains all queued continuations.
|
|
105
|
+
let now = 1_000_000;
|
|
106
|
+
let seq = 0;
|
|
107
|
+
const timers: Array<{ at: number; seq: number; resolve: () => void; reject: (e: unknown) => void }> = [];
|
|
108
|
+
const sleep = (ms: number, signal?: AbortSignal) =>
|
|
109
|
+
new Promise<void>((resolve, reject) => {
|
|
110
|
+
const entry = { at: now + ms, seq: seq++, resolve, reject };
|
|
111
|
+
timers.push(entry);
|
|
112
|
+
signal?.addEventListener(
|
|
113
|
+
'abort',
|
|
114
|
+
() => {
|
|
115
|
+
const i = timers.indexOf(entry);
|
|
116
|
+
if (i >= 0) timers.splice(i, 1);
|
|
117
|
+
reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
|
|
118
|
+
},
|
|
119
|
+
{ once: true }
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
const run = async (deadline: number) => {
|
|
123
|
+
// Fire timers in chronological order, jumping fake time to each one;
|
|
124
|
+
// drain continuations after every fire so chains that register a NEW
|
|
125
|
+
// timer (retry sleeps, queued slots) are seen on the next iteration.
|
|
126
|
+
for (let safety = 0; safety < 10_000; safety++) {
|
|
127
|
+
for (let i = 0; i < 30; i++) await new Promise((r) => setImmediate(r));
|
|
128
|
+
timers.sort((a, b) => a.at - b.at || a.seq - b.seq);
|
|
129
|
+
const next = timers[0];
|
|
130
|
+
if (!next || next.at > deadline) break;
|
|
131
|
+
timers.shift();
|
|
132
|
+
now = next.at;
|
|
133
|
+
next.resolve();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const sendTimes: number[] = [];
|
|
138
|
+
let searches = 0;
|
|
139
|
+
const client = new PixivClient({
|
|
140
|
+
auth: new StaticTokenProvider('t'),
|
|
141
|
+
retries: 2,
|
|
142
|
+
fetchImpl: async (url) => {
|
|
143
|
+
sendTimes.push(now);
|
|
144
|
+
const u = new URL(url);
|
|
145
|
+
if (u.pathname === '/v1/search/illust') {
|
|
146
|
+
searches++;
|
|
147
|
+
// Retry-After (30s) beats the short 10s ladder and sets the gate.
|
|
148
|
+
return searches <= 1 ? response(429, {}, { 'retry-after': '30' }) : response(200, { illusts: [], next_url: null });
|
|
149
|
+
}
|
|
150
|
+
return response(200, { illust: { id: Number(u.searchParams.get('illust_id')) } });
|
|
151
|
+
},
|
|
152
|
+
rateLimit: {
|
|
153
|
+
minIntervalMs: 1000,
|
|
154
|
+
jitterRatio: 0,
|
|
155
|
+
initialCooldownMs: 10_000,
|
|
156
|
+
maxCooldownMs: 600_000,
|
|
157
|
+
random: () => 0,
|
|
158
|
+
now: () => now,
|
|
159
|
+
sleep,
|
|
160
|
+
},
|
|
161
|
+
sleep,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// search gets a 429 (Retry-After 30s), retries after the gate cooldown.
|
|
165
|
+
const searchP = client.illustrations.search({ word: 'x', limit: 1 });
|
|
166
|
+
// Two details arrive concurrently; they must wait behind the gate, not fire.
|
|
167
|
+
const detailP = [2, 3].map((id) => client.illustrations.get(id));
|
|
168
|
+
|
|
169
|
+
await run(now + 60_000);
|
|
170
|
+
|
|
171
|
+
const searchResult = await searchP;
|
|
172
|
+
expect(searchResult.items).toEqual([]);
|
|
173
|
+
const details = await Promise.all(detailP);
|
|
174
|
+
expect(details.map((d) => d.id)).toEqual([2, 3]);
|
|
175
|
+
|
|
176
|
+
// Attempt 1 at t0 429s; the global gate parks EVERYTHING until +30s (the
|
|
177
|
+
// details do not fire at +1s/+2s as they would without the shared gate).
|
|
178
|
+
// After the cooldown all three remaining sends are strictly 1s apart.
|
|
179
|
+
expect(sendTimes[0]).toBe(1_000_000);
|
|
180
|
+
expect(sendTimes.slice(1)).toEqual([1_030_000, 1_031_000, 1_032_000]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe('pagination + abort', () => {
|
|
185
|
+
it('paginate walks next cursors and respects limit/maxPages', async () => {
|
|
186
|
+
const seen: number[] = [];
|
|
187
|
+
const result = await paginate<number>(
|
|
188
|
+
async (cursor) => {
|
|
189
|
+
const page = cursor ? Number(cursor) : 1;
|
|
190
|
+
seen.push(page);
|
|
191
|
+
return { items: [page, page], next: page < 3 ? String(page + 1) : null };
|
|
192
|
+
},
|
|
193
|
+
{ limit: 5 }
|
|
194
|
+
);
|
|
195
|
+
expect(result.items).toEqual([1, 1, 2, 2, 3]);
|
|
196
|
+
expect(seen).toEqual([1, 2, 3]);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('aborts a pagination walk', async () => {
|
|
200
|
+
const controller = new AbortController();
|
|
201
|
+
let pages = 0;
|
|
202
|
+
const p = paginate<number>(
|
|
203
|
+
async () => {
|
|
204
|
+
pages++;
|
|
205
|
+
if (pages === 2) controller.abort();
|
|
206
|
+
return { items: [1], next: 'more' };
|
|
207
|
+
},
|
|
208
|
+
{ signal: controller.signal, maxPages: 10 }
|
|
209
|
+
);
|
|
210
|
+
const result = await p;
|
|
211
|
+
expect(pages).toBe(2);
|
|
212
|
+
expect(result.items).toHaveLength(2);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('aborting a rate-limit wait rejects with PixivAbortError', async () => {
|
|
216
|
+
let now = 0;
|
|
217
|
+
const client = new PixivClient({
|
|
218
|
+
auth: new StaticTokenProvider('t'),
|
|
219
|
+
fetchImpl: (async () => response(200, { illust: { id: 1 } })) as FetchLike,
|
|
220
|
+
rateLimit: {
|
|
221
|
+
minIntervalMs: 10_000,
|
|
222
|
+
jitterRatio: 0,
|
|
223
|
+
random: () => 0,
|
|
224
|
+
now: () => now,
|
|
225
|
+
sleep: (ms, signal) =>
|
|
226
|
+
new Promise<void>((_resolve, reject) => {
|
|
227
|
+
signal?.addEventListener(
|
|
228
|
+
'abort',
|
|
229
|
+
() => reject(Object.assign(new Error('aborted'), { name: 'AbortError' })),
|
|
230
|
+
{ once: true }
|
|
231
|
+
);
|
|
232
|
+
}),
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
// Consume the immediate first slot, then abort the second reservation.
|
|
236
|
+
void client.illustrations.get(1);
|
|
237
|
+
await Promise.resolve();
|
|
238
|
+
await Promise.resolve();
|
|
239
|
+
const controller = new AbortController();
|
|
240
|
+
const p = client.illustrations.get(2, controller.signal);
|
|
241
|
+
await Promise.resolve();
|
|
242
|
+
await Promise.resolve();
|
|
243
|
+
controller.abort();
|
|
244
|
+
await expect(p).rejects.toBeInstanceOf(PixivAbortError);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('a top-level injected sleep also drives the gate pacing wait', async () => {
|
|
248
|
+
// Regression: the gate and the transport sleep in different layers; a host
|
|
249
|
+
// that injects one sleeper must not get real timers from the other (an
|
|
250
|
+
// unref'd default timer silently dropped requests in short-lived CLIs).
|
|
251
|
+
const sleepCalls: number[] = [];
|
|
252
|
+
let now = 0;
|
|
253
|
+
const client = new PixivClient({
|
|
254
|
+
auth: new StaticTokenProvider('t'),
|
|
255
|
+
fetchImpl: (async () => response(200, { illust: { id: 1 } })) as FetchLike,
|
|
256
|
+
sleep: (ms: number) => {
|
|
257
|
+
sleepCalls.push(ms);
|
|
258
|
+
now += ms;
|
|
259
|
+
return Promise.resolve();
|
|
260
|
+
},
|
|
261
|
+
rateLimit: { minIntervalMs: 1000, jitterRatio: 0, random: () => 0, now: () => now },
|
|
262
|
+
});
|
|
263
|
+
await client.illustrations.get(1);
|
|
264
|
+
await client.illustrations.get(2);
|
|
265
|
+
// The second request had to wait out the pacing interval at the gate.
|
|
266
|
+
expect(sleepCalls).toContain(1000);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { PixivClient } from '../../client';
|
|
2
|
+
import { StaticTokenProvider } from '../../auth/types';
|
|
3
|
+
import type { FetchLike } from '../../types';
|
|
4
|
+
import { PixivApiError, PixivNotFoundError } from '../../errors/errors';
|
|
5
|
+
|
|
6
|
+
interface Call {
|
|
7
|
+
url: string;
|
|
8
|
+
method: string;
|
|
9
|
+
headers: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function jsonClient(handler: (url: URL, call: Call) => unknown | Promise<unknown>) {
|
|
13
|
+
const calls: Call[] = [];
|
|
14
|
+
const fetchImpl: FetchLike = async (url, init) => {
|
|
15
|
+
const u = new URL(url);
|
|
16
|
+
const call: Call = { url, method: (init.method as string) ?? 'GET', headers: init.headers as Record<string, string> };
|
|
17
|
+
calls.push(call);
|
|
18
|
+
const data = await handler(u, call);
|
|
19
|
+
const body = typeof data === 'string' ? data : JSON.stringify(data);
|
|
20
|
+
return {
|
|
21
|
+
status: 200,
|
|
22
|
+
statusText: 'OK',
|
|
23
|
+
ok: true,
|
|
24
|
+
headers: { get: () => null },
|
|
25
|
+
json: async () => JSON.parse(body),
|
|
26
|
+
text: async () => body,
|
|
27
|
+
arrayBuffer: async () => new ArrayBuffer(0),
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const client = new PixivClient({
|
|
31
|
+
auth: new StaticTokenProvider('tok'),
|
|
32
|
+
fetchImpl,
|
|
33
|
+
rateLimit: { minIntervalMs: 0, jitterRatio: 0, random: () => 0, initialCooldownMs: 1000 },
|
|
34
|
+
});
|
|
35
|
+
return { client, calls };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe('IllustrationsApi', () => {
|
|
39
|
+
it('detail / get hit v1/illust/detail', async () => {
|
|
40
|
+
const { client, calls } = jsonClient(() => ({ illust: { id: 5 } }));
|
|
41
|
+
const illust = await client.illustrations.get(5);
|
|
42
|
+
expect(illust.id).toBe(5);
|
|
43
|
+
expect(calls[0].url).toContain('/v1/illust/detail?illust_id=5');
|
|
44
|
+
expect(calls[0].headers.Authorization).toBe('Bearer tok');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('searchPage maps IllustSearchOptions to Pixiv params (r18 omits filter, dates sent)', async () => {
|
|
48
|
+
const { client, calls } = jsonClient((u) => ({
|
|
49
|
+
illusts: [{ id: 1 }, { id: 2 }],
|
|
50
|
+
next_url: u.searchParams.get('start_date') ? `${u.origin}${u.pathname}?illust_id=next` : null,
|
|
51
|
+
}));
|
|
52
|
+
const page = await client.illustrations.searchPage({
|
|
53
|
+
word: 'cat',
|
|
54
|
+
sort: 'date_asc',
|
|
55
|
+
searchTarget: 'exact_match_for_tags',
|
|
56
|
+
includeR18: true,
|
|
57
|
+
startDate: '2024-01-01',
|
|
58
|
+
endDate: '2024-01-31',
|
|
59
|
+
});
|
|
60
|
+
expect(page.items).toHaveLength(2);
|
|
61
|
+
const u = new URL(calls[0].url);
|
|
62
|
+
expect(u.searchParams.get('word')).toBe('cat');
|
|
63
|
+
expect(u.searchParams.get('sort')).toBe('date_asc');
|
|
64
|
+
expect(u.searchParams.get('search_target')).toBe('exact_match_for_tags');
|
|
65
|
+
expect(u.searchParams.get('filter')).toBeNull();
|
|
66
|
+
expect(u.searchParams.get('start_date')).toBe('2024-01-01');
|
|
67
|
+
expect(u.searchParams.get('end_date')).toBe('2024-01-31');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('search walks next_url until limit', async () => {
|
|
71
|
+
const { client, calls } = jsonClient((u) => {
|
|
72
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
73
|
+
return { illusts: [{ id: page * 10 }, { id: page * 10 + 1 }], next_url: `https://x/v1/search/illust?p=${page + 1}` };
|
|
74
|
+
});
|
|
75
|
+
const result = await client.illustrations.search({ word: 'dog', limit: 3 });
|
|
76
|
+
expect(result.items.map((i) => i.id)).toEqual([10, 11, 20]);
|
|
77
|
+
// Page 2 still advertises a cursor; the caller decides whether to walk on.
|
|
78
|
+
expect(result.nextCursor).toContain('p=3');
|
|
79
|
+
expect(calls).toHaveLength(2);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('ranking walks next_url and respects limit', async () => {
|
|
83
|
+
const { client, calls } = jsonClient((u) => {
|
|
84
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
85
|
+
return { illusts: [{ id: page }], next_url: page < 3 ? `https://x/v1/illust/ranking?p=${page + 1}` : null };
|
|
86
|
+
});
|
|
87
|
+
const items = await client.illustrations.ranking('week', { date: '2024-01-01', limit: 2 });
|
|
88
|
+
expect(items).toHaveLength(2);
|
|
89
|
+
expect(new URL(calls[0].url).searchParams.get('mode')).toBe('week');
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('listByUser paginates and slices to limit', async () => {
|
|
93
|
+
const { client } = jsonClient((u) => {
|
|
94
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
95
|
+
return { illusts: [{ id: page }], next_url: page < 3 ? `https://x/v1/user/illusts?p=${page + 1}` : null };
|
|
96
|
+
});
|
|
97
|
+
const items = await client.illustrations.listByUser('99', { limit: 2 });
|
|
98
|
+
expect(items.map((i) => i.id)).toEqual([1, 2]);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('ugoiraMetadata unwraps ugoira_metadata', async () => {
|
|
102
|
+
const { client } = jsonClient(() => ({
|
|
103
|
+
ugoira_metadata: { zip_urls: { medium: 'm' }, frames: [{ file: '000.jpg', delay: 60 }] },
|
|
104
|
+
}));
|
|
105
|
+
const meta = await client.illustrations.ugoiraMetadata(42);
|
|
106
|
+
expect(meta.frames[0].delay).toBe(60);
|
|
107
|
+
expect(meta.zip_urls.medium).toBe('m');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('NovelsApi', () => {
|
|
112
|
+
it('detail hits v2; detailCompatible/detailWithTags fall back to v1 on a missing endpoint', async () => {
|
|
113
|
+
const client1 = jsonClient(() => ({ novel: { id: 1 } })).client;
|
|
114
|
+
expect((await client1.novels.detail(1)).id).toBe(1);
|
|
115
|
+
|
|
116
|
+
const client2 = jsonClient((u) => {
|
|
117
|
+
if (u.pathname === '/v2/novel/detail') {
|
|
118
|
+
return Promise.reject(new PixivNotFoundError('Pixiv API error: 404 Not Found', { endpoint: u.href }));
|
|
119
|
+
}
|
|
120
|
+
return { novel: { id: 7, tags: [{ name: 't' }] } };
|
|
121
|
+
}).client;
|
|
122
|
+
expect((await client2.novels.detailCompatible(7)).id).toBe(7);
|
|
123
|
+
const withTags = await client2.novels.detailWithTags(7);
|
|
124
|
+
expect(withTags.tags).toEqual([{ name: 't' }]);
|
|
125
|
+
expect(withTags.novel.id).toBe(7);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('text uses the webview marker chain first', async () => {
|
|
129
|
+
// The parser looks for 'novel: ' and slices until the next ',\n'.
|
|
130
|
+
const html = `prefix\nnovel: {"text":"hello"},\nrest`;
|
|
131
|
+
const { client, calls } = jsonClient(() => html);
|
|
132
|
+
const res = await client.novels.text(3);
|
|
133
|
+
expect(res.novel_text).toBe('hello');
|
|
134
|
+
expect(calls[0].url).toContain('/webview/v2/novel');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('text falls through webview -> app-api -> www ajax, dropping the App Bearer for ajax', async () => {
|
|
138
|
+
let stage = 0;
|
|
139
|
+
const { client, calls } = jsonClient((u) => {
|
|
140
|
+
stage++;
|
|
141
|
+
if (u.pathname === '/webview/v2/novel') return 'no marker here';
|
|
142
|
+
if (u.pathname === '/v1/novel/text') return { novel_text: ' ' };
|
|
143
|
+
if (u.hostname === 'www.pixiv.net') return { error: false, body: { content: 'ajax-body' } };
|
|
144
|
+
throw new Error('unexpected ' + u.href);
|
|
145
|
+
});
|
|
146
|
+
const res = await client.novels.text(9);
|
|
147
|
+
expect(res.novel_text).toBe('ajax-body');
|
|
148
|
+
const ajaxCall = calls.find((c) => c.url.includes('www.pixiv.net'))!;
|
|
149
|
+
expect(ajaxCall.headers.Authorization).toBeUndefined();
|
|
150
|
+
expect(ajaxCall.headers['App-OS']).toBeUndefined();
|
|
151
|
+
expect(ajaxCall.headers.Referer).toBe('https://www.pixiv.net/');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('text throws PixivApiError when every endpoint fails', async () => {
|
|
155
|
+
const client = jsonClient(() => '').client;
|
|
156
|
+
await expect(client.novels.text(11)).rejects.toBeInstanceOf(PixivApiError);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('ranking and user novels paginate', async () => {
|
|
160
|
+
const { client } = jsonClient((u) => {
|
|
161
|
+
if (u.pathname === '/v1/novel/ranking') {
|
|
162
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
163
|
+
return { novels: [{ id: page }], next_url: page < 2 ? `https://x/v1/novel/ranking?p=${page + 1}` : null };
|
|
164
|
+
}
|
|
165
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
166
|
+
return { novels: [{ id: 100 + page }], next_url: page < 2 ? `https://x/v1/user/novels?p=${page + 1}` : null };
|
|
167
|
+
});
|
|
168
|
+
expect(await client.novels.ranking('day', { limit: 5 })).toHaveLength(2);
|
|
169
|
+
expect((await client.novels.listByUser('3', { limit: 1 })).map((n) => n.id)).toEqual([101]);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('listSeries normalizes the series_content envelope and walks pages', async () => {
|
|
173
|
+
const { client } = jsonClient((u) => {
|
|
174
|
+
const page = Number(u.searchParams.get('p') ?? '1');
|
|
175
|
+
return {
|
|
176
|
+
novel_series_detail: {
|
|
177
|
+
series_content: [{ id: page, title: 't', user: { id: '1', name: 'u' }, create_date: '2024-01-01' }],
|
|
178
|
+
},
|
|
179
|
+
next_url: page < 2 ? `https://x/v1/novel/series?p=${page + 1}` : null,
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
const novels = await client.novels.listSeries(55);
|
|
183
|
+
expect(novels).toHaveLength(2);
|
|
184
|
+
expect(novels[0].user.name).toBe('u');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('TagsApi / UsersApi', () => {
|
|
189
|
+
it('autocomplete returns tag objects', async () => {
|
|
190
|
+
const { client } = jsonClient(() => ({ tags: [{ name: 'a' }, { name: 'b' }] }));
|
|
191
|
+
const tags = await client.tags.autocomplete('a');
|
|
192
|
+
expect(tags.map((t) => t.name)).toEqual(['a', 'b']);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('users.user unwraps per-user detail', async () => {
|
|
196
|
+
const { client } = jsonClient(() => ({ user: { id: '42', name: 'someone' } }));
|
|
197
|
+
expect((await client.users.user(42)).id).toBe('42');
|
|
198
|
+
});
|
|
199
|
+
});
|