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.
Files changed (788) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/version.js +1 -1
  3. package/dist/webui/package.json +1 -1
  4. package/node_modules/@redtidev/pixiv-client/LICENSE +21 -0
  5. package/node_modules/@redtidev/pixiv-client/README.md +103 -0
  6. package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.d.ts +6 -0
  7. package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.d.ts.map +1 -0
  8. package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.js +14 -0
  9. package/node_modules/@redtidev/pixiv-client/dist/app-api/exports.js.map +1 -0
  10. package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.d.ts +30 -0
  11. package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.d.ts.map +1 -0
  12. package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.js +137 -0
  13. package/node_modules/@redtidev/pixiv-client/dist/app-api/illustrations.js.map +1 -0
  14. package/node_modules/@redtidev/pixiv-client/dist/app-api/media.d.ts +16 -0
  15. package/node_modules/@redtidev/pixiv-client/dist/app-api/media.d.ts.map +1 -0
  16. package/node_modules/@redtidev/pixiv-client/dist/app-api/media.js +25 -0
  17. package/node_modules/@redtidev/pixiv-client/dist/app-api/media.js.map +1 -0
  18. package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.d.ts +43 -0
  19. package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.d.ts.map +1 -0
  20. package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.js +250 -0
  21. package/node_modules/@redtidev/pixiv-client/dist/app-api/novels.js.map +1 -0
  22. package/node_modules/@redtidev/pixiv-client/dist/app-api/options.d.ts +42 -0
  23. package/node_modules/@redtidev/pixiv-client/dist/app-api/options.d.ts.map +1 -0
  24. package/node_modules/@redtidev/pixiv-client/dist/app-api/options.js +7 -0
  25. package/node_modules/@redtidev/pixiv-client/dist/app-api/options.js.map +1 -0
  26. package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.d.ts +9 -0
  27. package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.d.ts.map +1 -0
  28. package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.js +22 -0
  29. package/node_modules/@redtidev/pixiv-client/dist/app-api/tags.js.map +1 -0
  30. package/node_modules/@redtidev/pixiv-client/dist/app-api/users.d.ts +17 -0
  31. package/node_modules/@redtidev/pixiv-client/dist/app-api/users.d.ts.map +1 -0
  32. package/node_modules/@redtidev/pixiv-client/dist/app-api/users.js +23 -0
  33. package/node_modules/@redtidev/pixiv-client/dist/app-api/users.js.map +1 -0
  34. package/node_modules/@redtidev/pixiv-client/dist/auth/types.d.ts +25 -0
  35. package/node_modules/@redtidev/pixiv-client/dist/auth/types.d.ts.map +1 -0
  36. package/node_modules/@redtidev/pixiv-client/dist/auth/types.js +24 -0
  37. package/node_modules/@redtidev/pixiv-client/dist/auth/types.js.map +1 -0
  38. package/node_modules/@redtidev/pixiv-client/dist/client.d.ts +42 -0
  39. package/node_modules/@redtidev/pixiv-client/dist/client.d.ts.map +1 -0
  40. package/node_modules/@redtidev/pixiv-client/dist/client.js +86 -0
  41. package/node_modules/@redtidev/pixiv-client/dist/client.js.map +1 -0
  42. package/node_modules/@redtidev/pixiv-client/dist/errors/errors.d.ts +117 -0
  43. package/node_modules/@redtidev/pixiv-client/dist/errors/errors.d.ts.map +1 -0
  44. package/node_modules/@redtidev/pixiv-client/dist/errors/errors.js +169 -0
  45. package/node_modules/@redtidev/pixiv-client/dist/errors/errors.js.map +1 -0
  46. package/node_modules/@redtidev/pixiv-client/dist/index.d.ts +25 -0
  47. package/node_modules/@redtidev/pixiv-client/dist/index.d.ts.map +1 -0
  48. package/node_modules/@redtidev/pixiv-client/dist/index.js +50 -0
  49. package/node_modules/@redtidev/pixiv-client/dist/index.js.map +1 -0
  50. package/node_modules/@redtidev/pixiv-client/dist/logger.d.ts +13 -0
  51. package/node_modules/@redtidev/pixiv-client/dist/logger.d.ts.map +1 -0
  52. package/node_modules/@redtidev/pixiv-client/dist/logger.js +10 -0
  53. package/node_modules/@redtidev/pixiv-client/dist/logger.js.map +1 -0
  54. package/node_modules/@redtidev/pixiv-client/dist/models/index.d.ts +112 -0
  55. package/node_modules/@redtidev/pixiv-client/dist/models/index.d.ts.map +1 -0
  56. package/node_modules/@redtidev/pixiv-client/dist/models/index.js +8 -0
  57. package/node_modules/@redtidev/pixiv-client/dist/models/index.js.map +1 -0
  58. package/node_modules/@redtidev/pixiv-client/dist/pagination.d.ts +22 -0
  59. package/node_modules/@redtidev/pixiv-client/dist/pagination.d.ts.map +1 -0
  60. package/node_modules/@redtidev/pixiv-client/dist/pagination.js +41 -0
  61. package/node_modules/@redtidev/pixiv-client/dist/pagination.js.map +1 -0
  62. package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.d.ts +95 -0
  63. package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.d.ts.map +1 -0
  64. package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.js +344 -0
  65. package/node_modules/@redtidev/pixiv-client/dist/rate-limit/RateLimitGate.js.map +1 -0
  66. package/node_modules/@redtidev/pixiv-client/dist/transport/transport.d.ts +65 -0
  67. package/node_modules/@redtidev/pixiv-client/dist/transport/transport.d.ts.map +1 -0
  68. package/node_modules/@redtidev/pixiv-client/dist/transport/transport.js +410 -0
  69. package/node_modules/@redtidev/pixiv-client/dist/transport/transport.js.map +1 -0
  70. package/node_modules/@redtidev/pixiv-client/dist/types.d.ts +186 -0
  71. package/node_modules/@redtidev/pixiv-client/dist/types.d.ts.map +1 -0
  72. package/node_modules/@redtidev/pixiv-client/dist/types.js +3 -0
  73. package/node_modules/@redtidev/pixiv-client/dist/types.js.map +1 -0
  74. package/node_modules/@redtidev/pixiv-client/dist/web-api/types.d.ts +19 -0
  75. package/node_modules/@redtidev/pixiv-client/dist/web-api/types.d.ts.map +1 -0
  76. package/node_modules/@redtidev/pixiv-client/dist/web-api/types.js +3 -0
  77. package/node_modules/@redtidev/pixiv-client/dist/web-api/types.js.map +1 -0
  78. package/node_modules/@redtidev/pixiv-client/package.json +55 -0
  79. package/node_modules/@redtidev/pixiv-client/src/__tests__/independence.test.ts +75 -0
  80. package/node_modules/@redtidev/pixiv-client/src/__tests__/integration.test.ts +268 -0
  81. package/node_modules/@redtidev/pixiv-client/src/app-api/__tests__/services.test.ts +199 -0
  82. package/node_modules/@redtidev/pixiv-client/src/app-api/exports.ts +5 -0
  83. package/node_modules/@redtidev/pixiv-client/src/app-api/illustrations.ts +144 -0
  84. package/node_modules/@redtidev/pixiv-client/src/app-api/media.ts +20 -0
  85. package/node_modules/@redtidev/pixiv-client/src/app-api/novels.ts +269 -0
  86. package/node_modules/@redtidev/pixiv-client/src/app-api/options.ts +73 -0
  87. package/node_modules/@redtidev/pixiv-client/src/app-api/tags.ts +21 -0
  88. package/node_modules/@redtidev/pixiv-client/src/app-api/users.ts +22 -0
  89. package/node_modules/@redtidev/pixiv-client/src/auth/types.ts +33 -0
  90. package/node_modules/@redtidev/pixiv-client/src/client.ts +105 -0
  91. package/node_modules/@redtidev/pixiv-client/src/errors/errors.ts +180 -0
  92. package/node_modules/@redtidev/pixiv-client/src/index.ts +91 -0
  93. package/node_modules/@redtidev/pixiv-client/src/logger.ts +18 -0
  94. package/node_modules/@redtidev/pixiv-client/src/models/index.ts +117 -0
  95. package/node_modules/@redtidev/pixiv-client/src/pagination.ts +46 -0
  96. package/node_modules/@redtidev/pixiv-client/src/rate-limit/RateLimitGate.ts +365 -0
  97. package/node_modules/@redtidev/pixiv-client/src/rate-limit/__tests__/RateLimitGate.test.ts +258 -0
  98. package/node_modules/@redtidev/pixiv-client/src/transport/__tests__/transport.test.ts +282 -0
  99. package/node_modules/@redtidev/pixiv-client/src/transport/transport.ts +500 -0
  100. package/node_modules/@redtidev/pixiv-client/src/types.ts +168 -0
  101. package/node_modules/@redtidev/pixiv-client/src/web-api/types.ts +19 -0
  102. package/node_modules/agent-base/LICENSE +22 -0
  103. package/node_modules/agent-base/README.md +69 -0
  104. package/node_modules/agent-base/dist/helpers.d.ts +15 -0
  105. package/node_modules/agent-base/dist/helpers.d.ts.map +1 -0
  106. package/node_modules/agent-base/dist/helpers.js +66 -0
  107. package/node_modules/agent-base/dist/helpers.js.map +1 -0
  108. package/node_modules/agent-base/dist/index.d.ts +41 -0
  109. package/node_modules/agent-base/dist/index.d.ts.map +1 -0
  110. package/node_modules/agent-base/dist/index.js +178 -0
  111. package/node_modules/agent-base/dist/index.js.map +1 -0
  112. package/node_modules/agent-base/package.json +46 -0
  113. package/node_modules/asynckit/LICENSE +21 -0
  114. package/node_modules/asynckit/README.md +233 -0
  115. package/node_modules/asynckit/bench.js +76 -0
  116. package/node_modules/asynckit/index.js +6 -0
  117. package/node_modules/asynckit/lib/abort.js +29 -0
  118. package/node_modules/asynckit/lib/async.js +34 -0
  119. package/node_modules/asynckit/lib/defer.js +26 -0
  120. package/node_modules/asynckit/lib/iterate.js +75 -0
  121. package/node_modules/asynckit/lib/readable_asynckit.js +91 -0
  122. package/node_modules/asynckit/lib/readable_parallel.js +25 -0
  123. package/node_modules/asynckit/lib/readable_serial.js +25 -0
  124. package/node_modules/asynckit/lib/readable_serial_ordered.js +29 -0
  125. package/node_modules/asynckit/lib/state.js +37 -0
  126. package/node_modules/asynckit/lib/streamify.js +141 -0
  127. package/node_modules/asynckit/lib/terminator.js +29 -0
  128. package/node_modules/asynckit/package.json +63 -0
  129. package/node_modules/asynckit/parallel.js +43 -0
  130. package/node_modules/asynckit/serial.js +17 -0
  131. package/node_modules/asynckit/serialOrdered.js +75 -0
  132. package/node_modules/asynckit/stream.js +21 -0
  133. package/node_modules/axios/CHANGELOG.md +1934 -0
  134. package/node_modules/axios/LICENSE +7 -0
  135. package/node_modules/axios/MIGRATION_GUIDE.md +877 -0
  136. package/node_modules/axios/README.md +2851 -0
  137. package/node_modules/axios/dist/axios.js +5807 -0
  138. package/node_modules/axios/dist/axios.min.js +5 -0
  139. package/node_modules/axios/dist/axios.min.js.map +1 -0
  140. package/node_modules/axios/dist/browser/axios.cjs +5829 -0
  141. package/node_modules/axios/dist/esm/axios.js +5850 -0
  142. package/node_modules/axios/dist/esm/axios.min.js +3 -0
  143. package/node_modules/axios/dist/esm/axios.min.js.map +1 -0
  144. package/node_modules/axios/dist/node/axios.cjs +6808 -0
  145. package/node_modules/axios/index.d.cts +766 -0
  146. package/node_modules/axios/index.d.ts +787 -0
  147. package/node_modules/axios/index.js +45 -0
  148. package/node_modules/axios/lib/adapters/README.md +36 -0
  149. package/node_modules/axios/lib/adapters/adapters.js +132 -0
  150. package/node_modules/axios/lib/adapters/fetch.js +696 -0
  151. package/node_modules/axios/lib/adapters/http.js +1490 -0
  152. package/node_modules/axios/lib/adapters/xhr.js +277 -0
  153. package/node_modules/axios/lib/axios.js +89 -0
  154. package/node_modules/axios/lib/cancel/CancelToken.js +135 -0
  155. package/node_modules/axios/lib/cancel/CanceledError.js +22 -0
  156. package/node_modules/axios/lib/cancel/isCancel.js +5 -0
  157. package/node_modules/axios/lib/core/Axios.js +306 -0
  158. package/node_modules/axios/lib/core/AxiosError.js +219 -0
  159. package/node_modules/axios/lib/core/AxiosHeaders.js +474 -0
  160. package/node_modules/axios/lib/core/InterceptorManager.js +171 -0
  161. package/node_modules/axios/lib/core/README.md +8 -0
  162. package/node_modules/axios/lib/core/buildFullPath.js +76 -0
  163. package/node_modules/axios/lib/core/dispatchRequest.js +95 -0
  164. package/node_modules/axios/lib/core/mergeConfig.js +174 -0
  165. package/node_modules/axios/lib/core/methodList.js +17 -0
  166. package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
  167. package/node_modules/axios/lib/core/settle.js +27 -0
  168. package/node_modules/axios/lib/core/transformData.js +28 -0
  169. package/node_modules/axios/lib/defaults/index.js +178 -0
  170. package/node_modules/axios/lib/defaults/transitional.js +10 -0
  171. package/node_modules/axios/lib/env/README.md +3 -0
  172. package/node_modules/axios/lib/env/classes/FormData.js +2 -0
  173. package/node_modules/axios/lib/env/data.js +1 -0
  174. package/node_modules/axios/lib/helpers/AxiosTransformStream.js +156 -0
  175. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
  176. package/node_modules/axios/lib/helpers/Http2Sessions.js +121 -0
  177. package/node_modules/axios/lib/helpers/HttpStatusCode.js +88 -0
  178. package/node_modules/axios/lib/helpers/README.md +7 -0
  179. package/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
  180. package/node_modules/axios/lib/helpers/bind.js +14 -0
  181. package/node_modules/axios/lib/helpers/buildURL.js +69 -0
  182. package/node_modules/axios/lib/helpers/callbackify.js +18 -0
  183. package/node_modules/axios/lib/helpers/combineURLs.js +23 -0
  184. package/node_modules/axios/lib/helpers/composeSignals.js +68 -0
  185. package/node_modules/axios/lib/helpers/cookies.js +64 -0
  186. package/node_modules/axios/lib/helpers/deprecatedMethod.js +31 -0
  187. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +166 -0
  188. package/node_modules/axios/lib/helpers/formDataToJSON.js +125 -0
  189. package/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
  190. package/node_modules/axios/lib/helpers/fromDataURI.js +69 -0
  191. package/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
  192. package/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
  193. package/node_modules/axios/lib/helpers/isURLSameOrigin.js +16 -0
  194. package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
  195. package/node_modules/axios/lib/helpers/null.js +2 -0
  196. package/node_modules/axios/lib/helpers/parseHeaders.js +71 -0
  197. package/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
  198. package/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
  199. package/node_modules/axios/lib/helpers/readBlob.js +15 -0
  200. package/node_modules/axios/lib/helpers/resolveConfig.js +107 -0
  201. package/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
  202. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +505 -0
  203. package/node_modules/axios/lib/helpers/speedometer.js +55 -0
  204. package/node_modules/axios/lib/helpers/spread.js +28 -0
  205. package/node_modules/axios/lib/helpers/throttle.js +45 -0
  206. package/node_modules/axios/lib/helpers/toFormData.js +279 -0
  207. package/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
  208. package/node_modules/axios/lib/helpers/trackStream.js +89 -0
  209. package/node_modules/axios/lib/helpers/validator.js +112 -0
  210. package/node_modules/axios/lib/platform/browser/classes/Blob.js +3 -0
  211. package/node_modules/axios/lib/platform/browser/classes/FormData.js +3 -0
  212. package/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +4 -0
  213. package/node_modules/axios/lib/platform/browser/index.js +13 -0
  214. package/node_modules/axios/lib/platform/common/utils.js +52 -0
  215. package/node_modules/axios/lib/platform/index.js +7 -0
  216. package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
  217. package/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
  218. package/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
  219. package/node_modules/axios/lib/platform/node/index.js +37 -0
  220. package/node_modules/axios/lib/utils.js +1150 -0
  221. package/node_modules/axios/node_modules/agent-base/README.md +145 -0
  222. package/node_modules/axios/node_modules/agent-base/dist/src/index.d.ts +78 -0
  223. package/node_modules/axios/node_modules/agent-base/dist/src/index.js +203 -0
  224. package/node_modules/axios/node_modules/agent-base/dist/src/index.js.map +1 -0
  225. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.d.ts +4 -0
  226. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js +18 -0
  227. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js.map +1 -0
  228. package/node_modules/axios/node_modules/agent-base/package.json +64 -0
  229. package/node_modules/axios/node_modules/agent-base/src/index.ts +345 -0
  230. package/node_modules/axios/node_modules/agent-base/src/promisify.ts +33 -0
  231. package/node_modules/axios/node_modules/debug/LICENSE +20 -0
  232. package/node_modules/axios/node_modules/debug/README.md +481 -0
  233. package/node_modules/axios/node_modules/debug/package.json +64 -0
  234. package/node_modules/axios/node_modules/debug/src/browser.js +272 -0
  235. package/node_modules/axios/node_modules/debug/src/common.js +292 -0
  236. package/node_modules/axios/node_modules/debug/src/index.js +10 -0
  237. package/node_modules/axios/node_modules/debug/src/node.js +263 -0
  238. package/node_modules/axios/node_modules/https-proxy-agent/README.md +137 -0
  239. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.d.ts +30 -0
  240. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js +177 -0
  241. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js.map +1 -0
  242. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.d.ts +23 -0
  243. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js +14 -0
  244. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js.map +1 -0
  245. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -0
  246. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
  247. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
  248. package/node_modules/axios/node_modules/https-proxy-agent/package.json +56 -0
  249. package/node_modules/axios/node_modules/ms/index.js +162 -0
  250. package/node_modules/axios/node_modules/ms/license.md +21 -0
  251. package/node_modules/axios/node_modules/ms/package.json +38 -0
  252. package/node_modules/axios/node_modules/ms/readme.md +59 -0
  253. package/node_modules/axios/package.json +203 -0
  254. package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  255. package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  256. package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  257. package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  258. package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  259. package/node_modules/call-bind-apply-helpers/README.md +62 -0
  260. package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  261. package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  262. package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  263. package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  264. package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  265. package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  266. package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  267. package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  268. package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  269. package/node_modules/call-bind-apply-helpers/index.js +15 -0
  270. package/node_modules/call-bind-apply-helpers/package.json +85 -0
  271. package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  272. package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  273. package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  274. package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  275. package/node_modules/combined-stream/License +19 -0
  276. package/node_modules/combined-stream/Readme.md +138 -0
  277. package/node_modules/combined-stream/lib/combined_stream.js +208 -0
  278. package/node_modules/combined-stream/package.json +25 -0
  279. package/node_modules/delayed-stream/.npmignore +1 -0
  280. package/node_modules/delayed-stream/License +19 -0
  281. package/node_modules/delayed-stream/Makefile +7 -0
  282. package/node_modules/delayed-stream/Readme.md +141 -0
  283. package/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
  284. package/node_modules/delayed-stream/package.json +27 -0
  285. package/node_modules/dunder-proto/.eslintrc +5 -0
  286. package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  287. package/node_modules/dunder-proto/.nycrc +13 -0
  288. package/node_modules/dunder-proto/CHANGELOG.md +24 -0
  289. package/node_modules/dunder-proto/LICENSE +21 -0
  290. package/node_modules/dunder-proto/README.md +54 -0
  291. package/node_modules/dunder-proto/get.d.ts +5 -0
  292. package/node_modules/dunder-proto/get.js +30 -0
  293. package/node_modules/dunder-proto/package.json +76 -0
  294. package/node_modules/dunder-proto/set.d.ts +5 -0
  295. package/node_modules/dunder-proto/set.js +35 -0
  296. package/node_modules/dunder-proto/test/get.js +34 -0
  297. package/node_modules/dunder-proto/test/index.js +4 -0
  298. package/node_modules/dunder-proto/test/set.js +50 -0
  299. package/node_modules/dunder-proto/tsconfig.json +9 -0
  300. package/node_modules/es-define-property/.eslintrc +13 -0
  301. package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  302. package/node_modules/es-define-property/.nycrc +9 -0
  303. package/node_modules/es-define-property/CHANGELOG.md +29 -0
  304. package/node_modules/es-define-property/LICENSE +21 -0
  305. package/node_modules/es-define-property/README.md +49 -0
  306. package/node_modules/es-define-property/index.d.ts +3 -0
  307. package/node_modules/es-define-property/index.js +14 -0
  308. package/node_modules/es-define-property/package.json +81 -0
  309. package/node_modules/es-define-property/test/index.js +56 -0
  310. package/node_modules/es-define-property/tsconfig.json +10 -0
  311. package/node_modules/es-errors/.eslintrc +5 -0
  312. package/node_modules/es-errors/.github/FUNDING.yml +12 -0
  313. package/node_modules/es-errors/CHANGELOG.md +40 -0
  314. package/node_modules/es-errors/LICENSE +21 -0
  315. package/node_modules/es-errors/README.md +55 -0
  316. package/node_modules/es-errors/eval.d.ts +3 -0
  317. package/node_modules/es-errors/eval.js +4 -0
  318. package/node_modules/es-errors/index.d.ts +3 -0
  319. package/node_modules/es-errors/index.js +4 -0
  320. package/node_modules/es-errors/package.json +80 -0
  321. package/node_modules/es-errors/range.d.ts +3 -0
  322. package/node_modules/es-errors/range.js +4 -0
  323. package/node_modules/es-errors/ref.d.ts +3 -0
  324. package/node_modules/es-errors/ref.js +4 -0
  325. package/node_modules/es-errors/syntax.d.ts +3 -0
  326. package/node_modules/es-errors/syntax.js +4 -0
  327. package/node_modules/es-errors/test/index.js +19 -0
  328. package/node_modules/es-errors/tsconfig.json +49 -0
  329. package/node_modules/es-errors/type.d.ts +3 -0
  330. package/node_modules/es-errors/type.js +4 -0
  331. package/node_modules/es-errors/uri.d.ts +3 -0
  332. package/node_modules/es-errors/uri.js +4 -0
  333. package/node_modules/es-object-atoms/.eslintrc +16 -0
  334. package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  335. package/node_modules/es-object-atoms/CHANGELOG.md +37 -0
  336. package/node_modules/es-object-atoms/LICENSE +21 -0
  337. package/node_modules/es-object-atoms/README.md +63 -0
  338. package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  339. package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  340. package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  341. package/node_modules/es-object-atoms/ToObject.js +10 -0
  342. package/node_modules/es-object-atoms/index.d.ts +3 -0
  343. package/node_modules/es-object-atoms/index.js +4 -0
  344. package/node_modules/es-object-atoms/isObject.d.ts +3 -0
  345. package/node_modules/es-object-atoms/isObject.js +6 -0
  346. package/node_modules/es-object-atoms/package.json +80 -0
  347. package/node_modules/es-object-atoms/test/index.js +38 -0
  348. package/node_modules/es-object-atoms/tsconfig.json +6 -0
  349. package/node_modules/es-set-tostringtag/.eslintrc +13 -0
  350. package/node_modules/es-set-tostringtag/.nycrc +9 -0
  351. package/node_modules/es-set-tostringtag/CHANGELOG.md +67 -0
  352. package/node_modules/es-set-tostringtag/LICENSE +21 -0
  353. package/node_modules/es-set-tostringtag/README.md +53 -0
  354. package/node_modules/es-set-tostringtag/index.d.ts +10 -0
  355. package/node_modules/es-set-tostringtag/index.js +35 -0
  356. package/node_modules/es-set-tostringtag/package.json +78 -0
  357. package/node_modules/es-set-tostringtag/test/index.js +85 -0
  358. package/node_modules/es-set-tostringtag/tsconfig.json +9 -0
  359. package/node_modules/follow-redirects/LICENSE +18 -0
  360. package/node_modules/follow-redirects/README.md +157 -0
  361. package/node_modules/follow-redirects/debug.js +15 -0
  362. package/node_modules/follow-redirects/http.js +1 -0
  363. package/node_modules/follow-redirects/https.js +1 -0
  364. package/node_modules/follow-redirects/index.js +709 -0
  365. package/node_modules/follow-redirects/package.json +58 -0
  366. package/node_modules/form-data/CHANGELOG.md +686 -0
  367. package/node_modules/form-data/License +19 -0
  368. package/node_modules/form-data/README.md +355 -0
  369. package/node_modules/form-data/index.d.ts +62 -0
  370. package/node_modules/form-data/lib/browser.js +4 -0
  371. package/node_modules/form-data/lib/form_data.js +506 -0
  372. package/node_modules/form-data/lib/populate.js +10 -0
  373. package/node_modules/form-data/package.json +82 -0
  374. package/node_modules/function-bind/.eslintrc +21 -0
  375. package/node_modules/function-bind/.github/FUNDING.yml +12 -0
  376. package/node_modules/function-bind/.github/SECURITY.md +3 -0
  377. package/node_modules/function-bind/.nycrc +13 -0
  378. package/node_modules/function-bind/CHANGELOG.md +136 -0
  379. package/node_modules/function-bind/LICENSE +20 -0
  380. package/node_modules/function-bind/README.md +46 -0
  381. package/node_modules/function-bind/implementation.js +84 -0
  382. package/node_modules/function-bind/index.js +5 -0
  383. package/node_modules/function-bind/package.json +87 -0
  384. package/node_modules/function-bind/test/.eslintrc +9 -0
  385. package/node_modules/function-bind/test/index.js +252 -0
  386. package/node_modules/get-intrinsic/.eslintrc +42 -0
  387. package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  388. package/node_modules/get-intrinsic/.nycrc +9 -0
  389. package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  390. package/node_modules/get-intrinsic/LICENSE +21 -0
  391. package/node_modules/get-intrinsic/README.md +71 -0
  392. package/node_modules/get-intrinsic/index.js +378 -0
  393. package/node_modules/get-intrinsic/package.json +97 -0
  394. package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  395. package/node_modules/get-proto/.eslintrc +10 -0
  396. package/node_modules/get-proto/.github/FUNDING.yml +12 -0
  397. package/node_modules/get-proto/.nycrc +9 -0
  398. package/node_modules/get-proto/CHANGELOG.md +21 -0
  399. package/node_modules/get-proto/LICENSE +21 -0
  400. package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  401. package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  402. package/node_modules/get-proto/README.md +50 -0
  403. package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  404. package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  405. package/node_modules/get-proto/index.d.ts +5 -0
  406. package/node_modules/get-proto/index.js +27 -0
  407. package/node_modules/get-proto/package.json +81 -0
  408. package/node_modules/get-proto/test/index.js +68 -0
  409. package/node_modules/get-proto/tsconfig.json +9 -0
  410. package/node_modules/gopd/.eslintrc +16 -0
  411. package/node_modules/gopd/.github/FUNDING.yml +12 -0
  412. package/node_modules/gopd/CHANGELOG.md +45 -0
  413. package/node_modules/gopd/LICENSE +21 -0
  414. package/node_modules/gopd/README.md +40 -0
  415. package/node_modules/gopd/gOPD.d.ts +1 -0
  416. package/node_modules/gopd/gOPD.js +4 -0
  417. package/node_modules/gopd/index.d.ts +5 -0
  418. package/node_modules/gopd/index.js +15 -0
  419. package/node_modules/gopd/package.json +77 -0
  420. package/node_modules/gopd/test/index.js +36 -0
  421. package/node_modules/gopd/tsconfig.json +9 -0
  422. package/node_modules/has-symbols/.eslintrc +11 -0
  423. package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  424. package/node_modules/has-symbols/.nycrc +9 -0
  425. package/node_modules/has-symbols/CHANGELOG.md +91 -0
  426. package/node_modules/has-symbols/LICENSE +21 -0
  427. package/node_modules/has-symbols/README.md +46 -0
  428. package/node_modules/has-symbols/index.d.ts +3 -0
  429. package/node_modules/has-symbols/index.js +14 -0
  430. package/node_modules/has-symbols/package.json +111 -0
  431. package/node_modules/has-symbols/shams.d.ts +3 -0
  432. package/node_modules/has-symbols/shams.js +45 -0
  433. package/node_modules/has-symbols/test/index.js +22 -0
  434. package/node_modules/has-symbols/test/shams/core-js.js +29 -0
  435. package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  436. package/node_modules/has-symbols/test/tests.js +58 -0
  437. package/node_modules/has-symbols/tsconfig.json +10 -0
  438. package/node_modules/has-tostringtag/.eslintrc +5 -0
  439. package/node_modules/has-tostringtag/.github/FUNDING.yml +12 -0
  440. package/node_modules/has-tostringtag/.nycrc +13 -0
  441. package/node_modules/has-tostringtag/CHANGELOG.md +42 -0
  442. package/node_modules/has-tostringtag/LICENSE +21 -0
  443. package/node_modules/has-tostringtag/README.md +46 -0
  444. package/node_modules/has-tostringtag/index.d.ts +3 -0
  445. package/node_modules/has-tostringtag/index.js +8 -0
  446. package/node_modules/has-tostringtag/package.json +108 -0
  447. package/node_modules/has-tostringtag/shams.d.ts +3 -0
  448. package/node_modules/has-tostringtag/shams.js +8 -0
  449. package/node_modules/has-tostringtag/test/index.js +21 -0
  450. package/node_modules/has-tostringtag/test/shams/core-js.js +31 -0
  451. package/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +30 -0
  452. package/node_modules/has-tostringtag/test/tests.js +15 -0
  453. package/node_modules/has-tostringtag/tsconfig.json +49 -0
  454. package/node_modules/hasown/.github/FUNDING.yml +12 -0
  455. package/node_modules/hasown/.nycrc +13 -0
  456. package/node_modules/hasown/CHANGELOG.md +58 -0
  457. package/node_modules/hasown/LICENSE +21 -0
  458. package/node_modules/hasown/README.md +40 -0
  459. package/node_modules/hasown/eslint.config.mjs +6 -0
  460. package/node_modules/hasown/index.d.ts +3 -0
  461. package/node_modules/hasown/index.js +8 -0
  462. package/node_modules/hasown/package.json +91 -0
  463. package/node_modules/hasown/tsconfig.json +6 -0
  464. package/node_modules/ip-address/LICENSE +19 -0
  465. package/node_modules/ip-address/README.md +308 -0
  466. package/node_modules/ip-address/dist/address-error.d.ts +15 -0
  467. package/node_modules/ip-address/dist/address-error.js +12 -0
  468. package/node_modules/ip-address/dist/address-error.js.map +1 -0
  469. package/node_modules/ip-address/dist/common.d.ts +69 -0
  470. package/node_modules/ip-address/dist/common.js +142 -0
  471. package/node_modules/ip-address/dist/common.js.map +1 -0
  472. package/node_modules/ip-address/dist/ip-address.d.ts +7 -0
  473. package/node_modules/ip-address/dist/ip-address.js +35 -0
  474. package/node_modules/ip-address/dist/ip-address.js.map +1 -0
  475. package/node_modules/ip-address/dist/ipv4.d.ts +340 -0
  476. package/node_modules/ip-address/dist/ipv4.js +580 -0
  477. package/node_modules/ip-address/dist/ipv4.js.map +1 -0
  478. package/node_modules/ip-address/dist/ipv6.d.ts +630 -0
  479. package/node_modules/ip-address/dist/ipv6.js +1443 -0
  480. package/node_modules/ip-address/dist/ipv6.js.map +1 -0
  481. package/node_modules/ip-address/dist/v4/constants.d.ts +16 -0
  482. package/node_modules/ip-address/dist/v4/constants.js +51 -0
  483. package/node_modules/ip-address/dist/v4/constants.js.map +1 -0
  484. package/node_modules/ip-address/dist/v6/constants.d.ts +58 -0
  485. package/node_modules/ip-address/dist/v6/constants.js +128 -0
  486. package/node_modules/ip-address/dist/v6/constants.js.map +1 -0
  487. package/node_modules/ip-address/dist/v6/helpers.d.ts +18 -0
  488. package/node_modules/ip-address/dist/v6/helpers.js +54 -0
  489. package/node_modules/ip-address/dist/v6/helpers.js.map +1 -0
  490. package/node_modules/ip-address/dist/v6/regular-expressions.d.ts +5 -0
  491. package/node_modules/ip-address/dist/v6/regular-expressions.js +95 -0
  492. package/node_modules/ip-address/dist/v6/regular-expressions.js.map +1 -0
  493. package/node_modules/ip-address/package.json +90 -0
  494. package/node_modules/math-intrinsics/.eslintrc +16 -0
  495. package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  496. package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  497. package/node_modules/math-intrinsics/LICENSE +21 -0
  498. package/node_modules/math-intrinsics/README.md +50 -0
  499. package/node_modules/math-intrinsics/abs.d.ts +1 -0
  500. package/node_modules/math-intrinsics/abs.js +4 -0
  501. package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  502. package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  503. package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  504. package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  505. package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  506. package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  507. package/node_modules/math-intrinsics/floor.d.ts +1 -0
  508. package/node_modules/math-intrinsics/floor.js +4 -0
  509. package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  510. package/node_modules/math-intrinsics/isFinite.js +12 -0
  511. package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  512. package/node_modules/math-intrinsics/isInteger.js +16 -0
  513. package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  514. package/node_modules/math-intrinsics/isNaN.js +6 -0
  515. package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  516. package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  517. package/node_modules/math-intrinsics/max.d.ts +1 -0
  518. package/node_modules/math-intrinsics/max.js +4 -0
  519. package/node_modules/math-intrinsics/min.d.ts +1 -0
  520. package/node_modules/math-intrinsics/min.js +4 -0
  521. package/node_modules/math-intrinsics/mod.d.ts +3 -0
  522. package/node_modules/math-intrinsics/mod.js +9 -0
  523. package/node_modules/math-intrinsics/package.json +86 -0
  524. package/node_modules/math-intrinsics/pow.d.ts +1 -0
  525. package/node_modules/math-intrinsics/pow.js +4 -0
  526. package/node_modules/math-intrinsics/round.d.ts +1 -0
  527. package/node_modules/math-intrinsics/round.js +4 -0
  528. package/node_modules/math-intrinsics/sign.d.ts +3 -0
  529. package/node_modules/math-intrinsics/sign.js +11 -0
  530. package/node_modules/math-intrinsics/test/index.js +192 -0
  531. package/node_modules/math-intrinsics/tsconfig.json +3 -0
  532. package/node_modules/mime-db/HISTORY.md +507 -0
  533. package/node_modules/mime-db/LICENSE +23 -0
  534. package/node_modules/mime-db/README.md +100 -0
  535. package/node_modules/mime-db/db.json +8519 -0
  536. package/node_modules/mime-db/index.js +12 -0
  537. package/node_modules/mime-db/package.json +60 -0
  538. package/node_modules/mime-types/HISTORY.md +397 -0
  539. package/node_modules/mime-types/LICENSE +23 -0
  540. package/node_modules/mime-types/README.md +113 -0
  541. package/node_modules/mime-types/index.js +188 -0
  542. package/node_modules/mime-types/package.json +44 -0
  543. package/node_modules/proxy-from-env/LICENSE +20 -0
  544. package/node_modules/proxy-from-env/README.md +163 -0
  545. package/node_modules/proxy-from-env/index.cjs +105 -0
  546. package/node_modules/proxy-from-env/index.js +103 -0
  547. package/node_modules/proxy-from-env/package.json +43 -0
  548. package/node_modules/smart-buffer/.prettierrc.yaml +5 -0
  549. package/node_modules/smart-buffer/.travis.yml +13 -0
  550. package/node_modules/smart-buffer/LICENSE +20 -0
  551. package/node_modules/smart-buffer/README.md +633 -0
  552. package/node_modules/smart-buffer/build/smartbuffer.js +1233 -0
  553. package/node_modules/smart-buffer/build/smartbuffer.js.map +1 -0
  554. package/node_modules/smart-buffer/build/utils.js +108 -0
  555. package/node_modules/smart-buffer/build/utils.js.map +1 -0
  556. package/node_modules/smart-buffer/docs/CHANGELOG.md +70 -0
  557. package/node_modules/smart-buffer/docs/README_v3.md +367 -0
  558. package/node_modules/smart-buffer/docs/ROADMAP.md +0 -0
  559. package/node_modules/smart-buffer/package.json +79 -0
  560. package/node_modules/smart-buffer/typings/smartbuffer.d.ts +755 -0
  561. package/node_modules/smart-buffer/typings/utils.d.ts +66 -0
  562. package/node_modules/socks/.eslintrc.cjs +11 -0
  563. package/node_modules/socks/.prettierrc.yaml +7 -0
  564. package/node_modules/socks/LICENSE +20 -0
  565. package/node_modules/socks/README.md +686 -0
  566. package/node_modules/socks/build/client/socksclient.js +793 -0
  567. package/node_modules/socks/build/client/socksclient.js.map +1 -0
  568. package/node_modules/socks/build/common/constants.js +108 -0
  569. package/node_modules/socks/build/common/constants.js.map +1 -0
  570. package/node_modules/socks/build/common/helpers.js +167 -0
  571. package/node_modules/socks/build/common/helpers.js.map +1 -0
  572. package/node_modules/socks/build/common/receivebuffer.js +43 -0
  573. package/node_modules/socks/build/common/receivebuffer.js.map +1 -0
  574. package/node_modules/socks/build/common/util.js +25 -0
  575. package/node_modules/socks/build/common/util.js.map +1 -0
  576. package/node_modules/socks/build/index.js +18 -0
  577. package/node_modules/socks/build/index.js.map +1 -0
  578. package/node_modules/socks/docs/examples/index.md +17 -0
  579. package/node_modules/socks/docs/examples/javascript/associateExample.md +90 -0
  580. package/node_modules/socks/docs/examples/javascript/bindExample.md +83 -0
  581. package/node_modules/socks/docs/examples/javascript/connectExample.md +258 -0
  582. package/node_modules/socks/docs/examples/typescript/associateExample.md +93 -0
  583. package/node_modules/socks/docs/examples/typescript/bindExample.md +86 -0
  584. package/node_modules/socks/docs/examples/typescript/connectExample.md +265 -0
  585. package/node_modules/socks/docs/index.md +5 -0
  586. package/node_modules/socks/docs/migratingFromV1.md +86 -0
  587. package/node_modules/socks/package.json +58 -0
  588. package/node_modules/socks/typings/client/socksclient.d.ts +162 -0
  589. package/node_modules/socks/typings/common/constants.d.ts +151 -0
  590. package/node_modules/socks/typings/common/helpers.d.ts +17 -0
  591. package/node_modules/socks/typings/common/receivebuffer.d.ts +12 -0
  592. package/node_modules/socks/typings/common/util.d.ts +14 -0
  593. package/node_modules/socks/typings/index.d.ts +1 -0
  594. package/node_modules/socks-proxy-agent/LICENSE +22 -0
  595. package/node_modules/socks-proxy-agent/README.md +50 -0
  596. package/node_modules/socks-proxy-agent/dist/index.d.ts +27 -0
  597. package/node_modules/socks-proxy-agent/dist/index.d.ts.map +1 -0
  598. package/node_modules/socks-proxy-agent/dist/index.js +195 -0
  599. package/node_modules/socks-proxy-agent/dist/index.js.map +1 -0
  600. package/node_modules/socks-proxy-agent/node_modules/debug/LICENSE +20 -0
  601. package/node_modules/socks-proxy-agent/node_modules/debug/README.md +481 -0
  602. package/node_modules/socks-proxy-agent/node_modules/debug/package.json +64 -0
  603. package/node_modules/socks-proxy-agent/node_modules/debug/src/browser.js +272 -0
  604. package/node_modules/socks-proxy-agent/node_modules/debug/src/common.js +292 -0
  605. package/node_modules/socks-proxy-agent/node_modules/debug/src/index.js +10 -0
  606. package/node_modules/socks-proxy-agent/node_modules/debug/src/node.js +263 -0
  607. package/node_modules/socks-proxy-agent/node_modules/ms/index.js +162 -0
  608. package/node_modules/socks-proxy-agent/node_modules/ms/license.md +21 -0
  609. package/node_modules/socks-proxy-agent/node_modules/ms/package.json +38 -0
  610. package/node_modules/socks-proxy-agent/node_modules/ms/readme.md +59 -0
  611. package/node_modules/socks-proxy-agent/package.json +142 -0
  612. package/node_modules/undici/LICENSE +21 -0
  613. package/node_modules/undici/README.md +473 -0
  614. package/node_modules/undici/docs/docs/api/Agent.md +80 -0
  615. package/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  616. package/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  617. package/node_modules/undici/docs/docs/api/Client.md +277 -0
  618. package/node_modules/undici/docs/docs/api/Connector.md +115 -0
  619. package/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  620. package/node_modules/undici/docs/docs/api/Cookies.md +101 -0
  621. package/node_modules/undici/docs/docs/api/Debug.md +62 -0
  622. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +204 -0
  623. package/node_modules/undici/docs/docs/api/DispatchInterceptor.md +60 -0
  624. package/node_modules/undici/docs/docs/api/Dispatcher.md +1347 -0
  625. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +162 -0
  626. package/node_modules/undici/docs/docs/api/Errors.md +49 -0
  627. package/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  628. package/node_modules/undici/docs/docs/api/Fetch.md +52 -0
  629. package/node_modules/undici/docs/docs/api/MockAgent.md +540 -0
  630. package/node_modules/undici/docs/docs/api/MockClient.md +77 -0
  631. package/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  632. package/node_modules/undici/docs/docs/api/MockPool.md +547 -0
  633. package/node_modules/undici/docs/docs/api/Pool.md +84 -0
  634. package/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  635. package/node_modules/undici/docs/docs/api/ProxyAgent.md +131 -0
  636. package/node_modules/undici/docs/docs/api/RedirectHandler.md +96 -0
  637. package/node_modules/undici/docs/docs/api/RetryAgent.md +45 -0
  638. package/node_modules/undici/docs/docs/api/RetryHandler.md +117 -0
  639. package/node_modules/undici/docs/docs/api/Util.md +25 -0
  640. package/node_modules/undici/docs/docs/api/WebSocket.md +51 -0
  641. package/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  642. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  643. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +136 -0
  644. package/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  645. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +20 -0
  646. package/node_modules/undici/index-fetch.js +35 -0
  647. package/node_modules/undici/index.d.ts +3 -0
  648. package/node_modules/undici/index.js +169 -0
  649. package/node_modules/undici/lib/api/abort-signal.js +57 -0
  650. package/node_modules/undici/lib/api/api-connect.js +108 -0
  651. package/node_modules/undici/lib/api/api-pipeline.js +251 -0
  652. package/node_modules/undici/lib/api/api-request.js +214 -0
  653. package/node_modules/undici/lib/api/api-stream.js +220 -0
  654. package/node_modules/undici/lib/api/api-upgrade.js +108 -0
  655. package/node_modules/undici/lib/api/index.js +7 -0
  656. package/node_modules/undici/lib/api/readable.js +385 -0
  657. package/node_modules/undici/lib/api/util.js +93 -0
  658. package/node_modules/undici/lib/core/connect.js +240 -0
  659. package/node_modules/undici/lib/core/constants.js +118 -0
  660. package/node_modules/undici/lib/core/diagnostics.js +202 -0
  661. package/node_modules/undici/lib/core/errors.js +425 -0
  662. package/node_modules/undici/lib/core/request.js +416 -0
  663. package/node_modules/undici/lib/core/symbols.js +67 -0
  664. package/node_modules/undici/lib/core/tree.js +152 -0
  665. package/node_modules/undici/lib/core/util.js +719 -0
  666. package/node_modules/undici/lib/dispatcher/agent.js +129 -0
  667. package/node_modules/undici/lib/dispatcher/balanced-pool.js +209 -0
  668. package/node_modules/undici/lib/dispatcher/client-h1.js +1496 -0
  669. package/node_modules/undici/lib/dispatcher/client-h2.js +744 -0
  670. package/node_modules/undici/lib/dispatcher/client.js +623 -0
  671. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +199 -0
  672. package/node_modules/undici/lib/dispatcher/dispatcher.js +65 -0
  673. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +160 -0
  674. package/node_modules/undici/lib/dispatcher/fixed-queue.js +117 -0
  675. package/node_modules/undici/lib/dispatcher/pool-base.js +194 -0
  676. package/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
  677. package/node_modules/undici/lib/dispatcher/pool.js +107 -0
  678. package/node_modules/undici/lib/dispatcher/proxy-agent.js +274 -0
  679. package/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  680. package/node_modules/undici/lib/global.js +32 -0
  681. package/node_modules/undici/lib/handler/decorator-handler.js +44 -0
  682. package/node_modules/undici/lib/handler/redirect-handler.js +232 -0
  683. package/node_modules/undici/lib/handler/retry-handler.js +408 -0
  684. package/node_modules/undici/lib/interceptor/dns.js +375 -0
  685. package/node_modules/undici/lib/interceptor/dump.js +123 -0
  686. package/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
  687. package/node_modules/undici/lib/interceptor/redirect.js +24 -0
  688. package/node_modules/undici/lib/interceptor/response-error.js +86 -0
  689. package/node_modules/undici/lib/interceptor/retry.js +19 -0
  690. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  691. package/node_modules/undici/lib/llhttp/constants.js +278 -0
  692. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +5 -0
  693. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +5 -0
  694. package/node_modules/undici/lib/llhttp/utils.js +15 -0
  695. package/node_modules/undici/lib/mock/mock-agent.js +160 -0
  696. package/node_modules/undici/lib/mock/mock-client.js +59 -0
  697. package/node_modules/undici/lib/mock/mock-errors.js +28 -0
  698. package/node_modules/undici/lib/mock/mock-interceptor.js +207 -0
  699. package/node_modules/undici/lib/mock/mock-pool.js +59 -0
  700. package/node_modules/undici/lib/mock/mock-symbols.js +23 -0
  701. package/node_modules/undici/lib/mock/mock-utils.js +367 -0
  702. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  703. package/node_modules/undici/lib/mock/pluralizer.js +29 -0
  704. package/node_modules/undici/lib/util/timers.js +423 -0
  705. package/node_modules/undici/lib/web/cache/cache.js +859 -0
  706. package/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  707. package/node_modules/undici/lib/web/cache/symbols.js +5 -0
  708. package/node_modules/undici/lib/web/cache/util.js +45 -0
  709. package/node_modules/undici/lib/web/cookies/constants.js +12 -0
  710. package/node_modules/undici/lib/web/cookies/index.js +184 -0
  711. package/node_modules/undici/lib/web/cookies/parse.js +310 -0
  712. package/node_modules/undici/lib/web/cookies/util.js +352 -0
  713. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +398 -0
  714. package/node_modules/undici/lib/web/eventsource/eventsource.js +480 -0
  715. package/node_modules/undici/lib/web/eventsource/util.js +37 -0
  716. package/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  717. package/node_modules/undici/lib/web/fetch/body.js +529 -0
  718. package/node_modules/undici/lib/web/fetch/constants.js +124 -0
  719. package/node_modules/undici/lib/web/fetch/data-url.js +744 -0
  720. package/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
  721. package/node_modules/undici/lib/web/fetch/file.js +126 -0
  722. package/node_modules/undici/lib/web/fetch/formdata-parser.js +474 -0
  723. package/node_modules/undici/lib/web/fetch/formdata.js +252 -0
  724. package/node_modules/undici/lib/web/fetch/global.js +40 -0
  725. package/node_modules/undici/lib/web/fetch/headers.js +687 -0
  726. package/node_modules/undici/lib/web/fetch/index.js +2272 -0
  727. package/node_modules/undici/lib/web/fetch/request.js +1037 -0
  728. package/node_modules/undici/lib/web/fetch/response.js +610 -0
  729. package/node_modules/undici/lib/web/fetch/symbols.js +9 -0
  730. package/node_modules/undici/lib/web/fetch/util.js +1632 -0
  731. package/node_modules/undici/lib/web/fetch/webidl.js +695 -0
  732. package/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
  733. package/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
  734. package/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
  735. package/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
  736. package/node_modules/undici/lib/web/fileapi/util.js +391 -0
  737. package/node_modules/undici/lib/web/websocket/connection.js +371 -0
  738. package/node_modules/undici/lib/web/websocket/constants.js +66 -0
  739. package/node_modules/undici/lib/web/websocket/events.js +329 -0
  740. package/node_modules/undici/lib/web/websocket/frame.js +96 -0
  741. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +100 -0
  742. package/node_modules/undici/lib/web/websocket/receiver.js +513 -0
  743. package/node_modules/undici/lib/web/websocket/sender.js +104 -0
  744. package/node_modules/undici/lib/web/websocket/symbols.js +12 -0
  745. package/node_modules/undici/lib/web/websocket/util.js +322 -0
  746. package/node_modules/undici/lib/web/websocket/websocket.js +595 -0
  747. package/node_modules/undici/package.json +160 -0
  748. package/node_modules/undici/scripts/strip-comments.js +8 -0
  749. package/node_modules/undici/types/README.md +6 -0
  750. package/node_modules/undici/types/agent.d.ts +31 -0
  751. package/node_modules/undici/types/api.d.ts +43 -0
  752. package/node_modules/undici/types/balanced-pool.d.ts +29 -0
  753. package/node_modules/undici/types/cache.d.ts +36 -0
  754. package/node_modules/undici/types/client.d.ts +125 -0
  755. package/node_modules/undici/types/connector.d.ts +34 -0
  756. package/node_modules/undici/types/content-type.d.ts +21 -0
  757. package/node_modules/undici/types/cookies.d.ts +28 -0
  758. package/node_modules/undici/types/diagnostics-channel.d.ts +66 -0
  759. package/node_modules/undici/types/dispatcher.d.ts +256 -0
  760. package/node_modules/undici/types/env-http-proxy-agent.d.ts +21 -0
  761. package/node_modules/undici/types/errors.d.ts +155 -0
  762. package/node_modules/undici/types/eventsource.d.ts +61 -0
  763. package/node_modules/undici/types/fetch.d.ts +209 -0
  764. package/node_modules/undici/types/file.d.ts +39 -0
  765. package/node_modules/undici/types/filereader.d.ts +54 -0
  766. package/node_modules/undici/types/formdata.d.ts +108 -0
  767. package/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  768. package/node_modules/undici/types/global-origin.d.ts +7 -0
  769. package/node_modules/undici/types/handlers.d.ts +15 -0
  770. package/node_modules/undici/types/header.d.ts +4 -0
  771. package/node_modules/undici/types/index.d.ts +71 -0
  772. package/node_modules/undici/types/interceptors.d.ts +32 -0
  773. package/node_modules/undici/types/mock-agent.d.ts +50 -0
  774. package/node_modules/undici/types/mock-client.d.ts +25 -0
  775. package/node_modules/undici/types/mock-errors.d.ts +12 -0
  776. package/node_modules/undici/types/mock-interceptor.d.ts +93 -0
  777. package/node_modules/undici/types/mock-pool.d.ts +25 -0
  778. package/node_modules/undici/types/patch.d.ts +33 -0
  779. package/node_modules/undici/types/pool-stats.d.ts +19 -0
  780. package/node_modules/undici/types/pool.d.ts +39 -0
  781. package/node_modules/undici/types/proxy-agent.d.ts +29 -0
  782. package/node_modules/undici/types/readable.d.ts +65 -0
  783. package/node_modules/undici/types/retry-agent.d.ts +8 -0
  784. package/node_modules/undici/types/retry-handler.d.ts +116 -0
  785. package/node_modules/undici/types/util.d.ts +18 -0
  786. package/node_modules/undici/types/webidl.d.ts +228 -0
  787. package/node_modules/undici/types/websocket.d.ts +150 -0
  788. package/package.json +4 -1
@@ -0,0 +1,365 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+
3
+ import { PixivAbortError, PixivCircuitOpenError } from '../errors/errors';
4
+ import type { KitLogger } from '../logger';
5
+ import type {
6
+ KitEventListener,
7
+ RateLimitOptions,
8
+ RateLimitState,
9
+ RateLimitStateStore,
10
+ RateLimitStatus,
11
+ } from '../types';
12
+
13
+ /** Conservative gate defaults (see packages/pixiv-client/README.md). */
14
+ export const DEFAULT_RATE_LIMIT: Required<
15
+ Pick<
16
+ RateLimitOptions,
17
+ | 'minIntervalMs'
18
+ | 'jitterRatio'
19
+ | 'initialCooldownMs'
20
+ | 'maxCooldownMs'
21
+ | 'decaySuccesses'
22
+ | 'openThreshold'
23
+ | 'scope'
24
+ >
25
+ > = {
26
+ minIntervalMs: 1000,
27
+ jitterRatio: 0.25,
28
+ initialCooldownMs: 60_000,
29
+ maxCooldownMs: 15 * 60_000,
30
+ decaySuccesses: 20,
31
+ openThreshold: 4,
32
+ scope: 'default',
33
+ };
34
+
35
+ function freshState(now: number): RateLimitState {
36
+ return {
37
+ nextAllowedAt: 0,
38
+ cooldownUntil: 0,
39
+ penaltyLevel: 0,
40
+ last429At: null,
41
+ circuitState: 'closed',
42
+ consecutiveSuccesses: 0,
43
+ updatedAt: now,
44
+ };
45
+ }
46
+
47
+ /** Process-local state store, used when the host injects no persistence. */
48
+ export class MemoryRateLimitStateStore implements RateLimitStateStore {
49
+ private readonly map = new Map<string, RateLimitState>();
50
+ load(scope: string): RateLimitState | null {
51
+ return this.map.get(scope) ?? null;
52
+ }
53
+ save(scope: string, state: RateLimitState): void {
54
+ // Clone so later in-place mutations cannot mutate the stored snapshot.
55
+ this.map.set(scope, { ...state });
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Pacing/cooldown waits MUST keep the event loop referenced: an unref'd timer
61
+ * lets a CLI/script process exit silently mid-wait instead of sending the
62
+ * request (observed as requests that "never happen" with exit code 0).
63
+ */
64
+ const defaultSleep = (ms: number, signal?: AbortSignal) =>
65
+ delay(ms, undefined, signal ? { signal } : undefined);
66
+
67
+ /**
68
+ * The single shared gate for ALL Pixiv traffic of one client.
69
+ *
70
+ * Two responsibilities, both fixed here instead of spread across callers:
71
+ *
72
+ * 1. Pacing via SLOT RESERVATION. `acquire()` synchronously reserves the next
73
+ * send instant before it awaits anything. N concurrent callers therefore
74
+ * leave at t0, t0+interval, t0+2*interval ... instead of all waking from
75
+ * the same `nextAllowedAt` simultaneously (the old burst bug).
76
+ *
77
+ * 2. The global 429 cooldown + circuit breaker. A 429 anywhere parks the
78
+ * whole client (other requests wait at the gate, they do not fire); at
79
+ * openThreshold consecutive penalties the circuit opens and requests fast
80
+ * fail until one half-open probe succeeds.
81
+ */
82
+ export class RateLimitGate {
83
+ private readonly minIntervalMs: number;
84
+ private readonly jitterRatio: number;
85
+ private readonly initialCooldownMs: number;
86
+ private readonly maxCooldownMs: number;
87
+ private readonly decaySuccesses: number;
88
+ private readonly openThreshold: number;
89
+ private readonly scope: string;
90
+ private readonly store: RateLimitStateStore;
91
+ private readonly clock: () => number;
92
+ private readonly sleeper: (ms: number, signal?: AbortSignal) => Promise<void>;
93
+ private readonly random: () => number;
94
+ private state: RateLimitState | null = null;
95
+ private loaded: Promise<void> | null = null;
96
+ /**
97
+ * Reservation chain. Callers may REACH acquire() at different microtask
98
+ * times (auth token fetch, coalescing), so synchronously mutating the slot
99
+ * cursor is not enough: each caller must reserve strictly after the previous
100
+ * caller reserved. The chain serializes ONLY the reservation, never the
101
+ * request itself.
102
+ */
103
+ private reservationQueue: Promise<void> = Promise.resolve();
104
+
105
+ /**
106
+ * Synchronously warm the state from a state store whose load() is sync
107
+ * (MemoryRateLimitStateStore, better-sqlite3, ...). Reservation in
108
+ * {@link acquire} then happens with NO preceding await, which is what makes
109
+ * concurrent callers serialize (A 0s, B 1s, C 2s ...).
110
+ */
111
+ preload(): void {
112
+ if (this.state) return;
113
+ try {
114
+ const persisted = this.store.load(this.scope) as RateLimitState | null | Promise<RateLimitState | null>;
115
+ if (persisted instanceof Promise) return; // truly async store: use ensureLoaded
116
+ this.applyLoaded(persisted);
117
+ } catch (e) {
118
+ this.logger?.warn('rate-limit state load failed, starting fresh', { error: String(e) });
119
+ }
120
+ }
121
+
122
+ constructor(
123
+ options: RateLimitOptions = {},
124
+ private readonly logger?: KitLogger,
125
+ private readonly emit?: KitEventListener
126
+ ) {
127
+ this.minIntervalMs = options.minIntervalMs ?? DEFAULT_RATE_LIMIT.minIntervalMs;
128
+ this.jitterRatio = options.jitterRatio ?? DEFAULT_RATE_LIMIT.jitterRatio;
129
+ this.initialCooldownMs = options.initialCooldownMs ?? DEFAULT_RATE_LIMIT.initialCooldownMs;
130
+ this.maxCooldownMs = options.maxCooldownMs ?? DEFAULT_RATE_LIMIT.maxCooldownMs;
131
+ this.decaySuccesses = options.decaySuccesses ?? DEFAULT_RATE_LIMIT.decaySuccesses;
132
+ this.openThreshold = options.openThreshold ?? DEFAULT_RATE_LIMIT.openThreshold;
133
+ this.scope = options.scope ?? DEFAULT_RATE_LIMIT.scope;
134
+ this.store = options.stateStore ?? new MemoryRateLimitStateStore();
135
+ this.clock = options.now ?? (() => Date.now());
136
+ this.sleeper = options.sleep ?? defaultSleep;
137
+ this.random = options.random ?? Math.random;
138
+ // Best-effort sync warmup: with a sync store this makes the very first
139
+ // slot reservation synchronous too (no async-load burst at startup).
140
+ this.preload();
141
+ }
142
+
143
+ private applyLoaded(persisted: RateLimitState | null): void {
144
+ const now = this.clock();
145
+ this.state = persisted ?? freshState(now);
146
+ // A process restart lands in HALF_OPEN with an expired cooldown:
147
+ // normalise to CLOSED so the gate is usable; an OPEN with remaining
148
+ // cooldown stays OPEN.
149
+ if (this.state.circuitState === 'half_open' && this.state.cooldownUntil <= now) {
150
+ this.state.circuitState = 'closed';
151
+ }
152
+ }
153
+
154
+ private async ensureLoaded(): Promise<RateLimitState> {
155
+ if (this.state) return this.state;
156
+ if (!this.loaded) {
157
+ this.loaded = Promise.resolve(this.store.load(this.scope)).then((persisted) => {
158
+ if (!this.state) this.applyLoaded(persisted);
159
+ });
160
+ }
161
+ await this.loaded;
162
+ return this.state!;
163
+ }
164
+
165
+ private persist(): void {
166
+ if (!this.state) return;
167
+ this.state.updatedAt = this.clock();
168
+ try {
169
+ const result = this.store.save(this.scope, { ...this.state });
170
+ if (result instanceof Promise) result.catch((e) => this.logger?.warn('rate-limit state save failed', { error: String(e) }));
171
+ } catch (e) {
172
+ this.logger?.warn('rate-limit state save failed', { error: String(e) });
173
+ }
174
+ }
175
+
176
+ /** Test/inspection helper. */
177
+ async getState(): Promise<RateLimitState> {
178
+ return this.ensureLoaded();
179
+ }
180
+
181
+ /**
182
+ * Reserve a send slot and wait until it becomes due.
183
+ * Throws PixivCircuitOpenError while OPEN and the cooldown has not elapsed;
184
+ * when it has elapsed exactly one caller transitions to HALF_OPEN and acts
185
+ * as the probe; further callers fast-fail until the probe resolves.
186
+ */
187
+ async acquire(signal?: AbortSignal): Promise<{ probe: boolean }> {
188
+ if (signal?.aborted) throw new PixivAbortError('aborted before rate-limit slot');
189
+
190
+ // Serialize the decision + reservation; the actual sleep happens AFTER
191
+ // releasing the queue, so requests still overlap on the wire while send
192
+ // times are strictly t, t+i, t+2i ... (never a t+i burst).
193
+ const previous = this.reservationQueue;
194
+ let release: () => void = () => {};
195
+ this.reservationQueue = new Promise<void>((resolve) => {
196
+ release = resolve;
197
+ });
198
+ await previous;
199
+
200
+ let waitMs: number;
201
+ let probe = false;
202
+ try {
203
+ if (!this.state) await this.ensureLoaded();
204
+ const s = this.state!;
205
+ const now = this.clock();
206
+
207
+ if (s.circuitState === 'open') {
208
+ if (now < s.cooldownUntil) {
209
+ throw new PixivCircuitOpenError('Pixiv rate-limit circuit is open', {
210
+ retryAfterMs: s.cooldownUntil - now,
211
+ });
212
+ }
213
+ // Cooldown elapsed: allow exactly one probe.
214
+ s.circuitState = 'half_open';
215
+ probe = true;
216
+ this.emit?.({ type: 'circuit_half_open' });
217
+ this.persist();
218
+ } else if (s.circuitState === 'half_open') {
219
+ throw new PixivCircuitOpenError('Pixiv rate-limit circuit half-open probe in flight', {
220
+ retryAfterMs: Math.max(0, s.cooldownUntil - now),
221
+ });
222
+ }
223
+
224
+ const scheduledAt = Math.max(now, s.nextAllowedAt, s.cooldownUntil);
225
+ const jitter = this.minIntervalMs * this.jitterRatio * this.random();
226
+ s.nextAllowedAt = scheduledAt + this.minIntervalMs + jitter;
227
+ waitMs = scheduledAt - now;
228
+ } finally {
229
+ release();
230
+ }
231
+
232
+ if (waitMs > 0) {
233
+ try {
234
+ await this.sleeper(waitMs, signal);
235
+ } catch {
236
+ throw new PixivAbortError('aborted while waiting for rate-limit slot');
237
+ }
238
+ // Re-validate after sleeping: a 429 from a request that was IN FLIGHT
239
+ // while this slot was reserved may have moved cooldownUntil forward.
240
+ // Without this check, callers whose pacing slots were booked before the
241
+ // 429 arrived would fire straight through the new cooldown.
242
+ if (this.state) {
243
+ const now2 = this.clock();
244
+ if (this.state.circuitState === 'open' && now2 < this.state.cooldownUntil) {
245
+ throw new PixivCircuitOpenError('Pixiv rate-limit circuit opened while waiting for a slot', {
246
+ retryAfterMs: this.state.cooldownUntil - now2,
247
+ });
248
+ }
249
+ if (now2 < this.state.cooldownUntil) {
250
+ return this.acquire(signal);
251
+ }
252
+ }
253
+ }
254
+ return { probe };
255
+ }
256
+
257
+ /**
258
+ * A half-open probe failed for ANY reason (429 or transient). Reopen the
259
+ * circuit with a fresh cooldown rather than declaring health on one 5xx.
260
+ */
261
+ async reportProbeFailure(waitMs: number): Promise<void> {
262
+ const s = await this.ensureLoaded();
263
+ if (s.circuitState !== 'half_open') return;
264
+ const now = this.clock();
265
+ s.circuitState = 'open';
266
+ s.cooldownUntil = Math.max(s.cooldownUntil, now + waitMs);
267
+ s.nextAllowedAt = Math.max(s.nextAllowedAt, s.cooldownUntil);
268
+ this.emit?.({ type: 'circuit_opened', until: s.cooldownUntil });
269
+ this.persist();
270
+ }
271
+
272
+ /**
273
+ * Record a 429 and compute the cooldown that was applied globally.
274
+ * Retry-After is always respected as a floor; the exponential ladder is
275
+ * 60s -> 120s -> 240s -> 480s ... capped at maxCooldownMs.
276
+ */
277
+ async reportRateLimited(retryAfterHeader?: string | null): Promise<{ waitMs: number; circuitOpened: boolean }> {
278
+ const s = await this.ensureLoaded();
279
+ const now = this.clock();
280
+ s.penaltyLevel += 1;
281
+ s.consecutiveSuccesses = 0;
282
+ s.last429At = now;
283
+
284
+ const hintedMs = parseRetryAfter(retryAfterHeader, now);
285
+ const ladder = this.initialCooldownMs * 2 ** Math.max(0, s.penaltyLevel - 1);
286
+ const jitteredLadder = ladder * (1 + this.random() * this.jitterRatio);
287
+ const computed = Math.min(this.maxCooldownMs, jitteredLadder);
288
+ const waitMs = Math.max(hintedMs ?? 0, computed);
289
+
290
+ const wasOpen = s.circuitState === 'open';
291
+ s.cooldownUntil = Math.max(s.cooldownUntil, now + waitMs);
292
+ s.nextAllowedAt = Math.max(s.nextAllowedAt, s.cooldownUntil);
293
+
294
+ let circuitOpened = false;
295
+ if (s.penaltyLevel >= this.openThreshold && s.circuitState !== 'open') {
296
+ s.circuitState = 'open';
297
+ circuitOpened = true;
298
+ } else if (s.circuitState === 'half_open') {
299
+ // Probe failed: reopen.
300
+ s.circuitState = 'open';
301
+ circuitOpened = true;
302
+ }
303
+
304
+ this.emit?.({
305
+ type: 'rate_limited',
306
+ endpoint: '',
307
+ retryAfterMs: waitMs,
308
+ penaltyLevel: s.penaltyLevel,
309
+ });
310
+ this.emit?.({ type: 'cooldown_started', until: s.cooldownUntil, penaltyLevel: s.penaltyLevel });
311
+ if (circuitOpened && !wasOpen) this.emit?.({ type: 'circuit_opened', until: s.cooldownUntil });
312
+ this.logger?.warn('Pixiv rate limit cooldown', {
313
+ penaltyLevel: s.penaltyLevel,
314
+ waitSec: Math.round(waitMs / 1000),
315
+ circuitState: s.circuitState,
316
+ });
317
+ this.persist();
318
+ return { waitMs, circuitOpened };
319
+ }
320
+
321
+ /**
322
+ * Record a successful response. The penalty level only DECAYS after a run of
323
+ * consecutive successes — one lucky 200 never clears the punishment. A
324
+ * successful half-open probe closes the circuit and buys one decay step.
325
+ */
326
+ async reportSuccess(): Promise<void> {
327
+ const s = await this.ensureLoaded();
328
+ const wasHalfOpen = s.circuitState === 'half_open';
329
+ s.consecutiveSuccesses += 1;
330
+
331
+ let changed = wasHalfOpen;
332
+ if (wasHalfOpen) {
333
+ s.circuitState = 'closed';
334
+ s.penaltyLevel = Math.max(0, s.penaltyLevel - 1);
335
+ s.consecutiveSuccesses = 0;
336
+ this.emit?.({ type: 'circuit_closed' });
337
+ this.logger?.info('Pixiv rate-limit probe succeeded, circuit closed');
338
+ } else if (s.penaltyLevel > 0 && s.consecutiveSuccesses >= this.decaySuccesses) {
339
+ s.penaltyLevel -= 1;
340
+ s.consecutiveSuccesses = 0;
341
+ changed = true;
342
+ }
343
+ if (changed) this.persist();
344
+ }
345
+
346
+ async getStatus(): Promise<RateLimitStatus> {
347
+ const s = await this.ensureLoaded();
348
+ const now = this.clock();
349
+ return {
350
+ circuitState: s.circuitState,
351
+ cooldownRemainingMs: Math.max(0, s.cooldownUntil - now),
352
+ penaltyLevel: s.penaltyLevel,
353
+ last429At: s.last429At,
354
+ nextAllowedInMs: Math.max(0, s.nextAllowedAt - now),
355
+ };
356
+ }
357
+ }
358
+
359
+ export function parseRetryAfter(value: string | null | undefined, now: number): number | null {
360
+ if (!value) return null;
361
+ const seconds = Number(value);
362
+ if (Number.isFinite(seconds)) return seconds * 1000;
363
+ const date = Date.parse(value);
364
+ return Number.isFinite(date) ? Math.max(0, date - now) : null;
365
+ }
@@ -0,0 +1,258 @@
1
+ import { RateLimitGate, MemoryRateLimitStateStore, DEFAULT_RATE_LIMIT } from '../RateLimitGate';
2
+ import { PixivCircuitOpenError } from '../../errors/errors';
3
+ import type { RateLimitState } from '../../types';
4
+
5
+ /**
6
+ * Virtual clock with a deadline queue. `sleep(ms)` resolves when fake time
7
+ * reaches its deadline; `tick` jumps to each deadline in order, firing FIFO
8
+ * among equal deadlines, and drains microtasks after each fire so chains that
9
+ * register new sleeps at the same instant are resolved in registration order.
10
+ */
11
+ function virtualTime(start = 1_000_000) {
12
+ let now = start;
13
+ let seq = 0;
14
+ const scheduled: Array<{ at: number; seq: number; resolve: () => void }> = [];
15
+
16
+ const sleep = (ms: number, signal?: AbortSignal) =>
17
+ new Promise<void>((resolve, reject) => {
18
+ const entry = { at: now + ms, seq: seq++, resolve };
19
+ scheduled.push(entry);
20
+ if (signal) {
21
+ if (signal.aborted) {
22
+ reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
23
+ return;
24
+ }
25
+ signal.addEventListener(
26
+ 'abort',
27
+ () => {
28
+ const i = scheduled.indexOf(entry);
29
+ if (i >= 0) scheduled.splice(i, 1);
30
+ reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
31
+ },
32
+ { once: true }
33
+ );
34
+ }
35
+ });
36
+
37
+ const flushMicrotasks = async () => {
38
+ for (let i = 0; i < 100; i++) {
39
+ await Promise.resolve();
40
+ await new Promise((r) => setImmediate(r));
41
+ }
42
+ };
43
+
44
+ const tick = async (ms: number) => {
45
+ const target = now + ms;
46
+ // Let any synchronous-then-microtask chains (ensureLoaded, reservation
47
+ // queue) register their sleeps before we start jumping time.
48
+ await flushMicrotasks();
49
+ for (let safety = 0; safety < 1_000_000; safety++) {
50
+ const due = scheduled.filter((s) => s.at <= target);
51
+ if (!due.length) break;
52
+ due.sort((a, b) => (a.at - b.at) || (a.seq - b.seq));
53
+ const next = due[0];
54
+ scheduled.splice(scheduled.indexOf(next), 1);
55
+ now = next.at;
56
+ next.resolve();
57
+ // Drain continuation microtasks before picking the next deadline; a
58
+ // continuation may register a new sleep at this exact timestamp with a
59
+ // later seq, preserving FIFO spacing (1001 then 1001-registered sleep).
60
+ for (let i = 0; i < 5; i++) await Promise.resolve();
61
+ }
62
+ now = target;
63
+ };
64
+
65
+ return {
66
+ now: () => now,
67
+ sleep,
68
+ tick,
69
+ advanceOnly: (ms: number) => {
70
+ now += ms;
71
+ },
72
+ };
73
+ }
74
+
75
+ function gate(opts: ConstructorParameters<typeof RateLimitGate>[0] = {}) {
76
+ const t = virtualTime();
77
+ const g = new RateLimitGate(
78
+ {
79
+ minIntervalMs: opts.minIntervalMs ?? 1000,
80
+ jitterRatio: 0,
81
+ initialCooldownMs: opts.initialCooldownMs ?? 60_000,
82
+ maxCooldownMs: opts.maxCooldownMs ?? 900_000,
83
+ decaySuccesses: opts.decaySuccesses ?? 20,
84
+ openThreshold: opts.openThreshold ?? 4,
85
+ stateStore: opts.stateStore,
86
+ scope: opts.scope,
87
+ now: t.now,
88
+ sleep: t.sleep,
89
+ random: () => 0,
90
+ }
91
+ );
92
+ return { g, t };
93
+ }
94
+
95
+ describe('RateLimitGate pacing', () => {
96
+ it('defaults to conservative pacing (1000ms, jitter, 60s cooldown)', () => {
97
+ expect(DEFAULT_RATE_LIMIT.minIntervalMs).toBe(1000);
98
+ expect(DEFAULT_RATE_LIMIT.initialCooldownMs).toBe(60_000);
99
+ expect(DEFAULT_RATE_LIMIT.jitterRatio).toBeGreaterThan(0);
100
+ });
101
+
102
+ it('serializes concurrent callers with slot reservation (no burst)', async () => {
103
+ const { g, t } = gate();
104
+ const slots: number[] = [];
105
+ const grab = async () => {
106
+ await g.acquire();
107
+ slots.push(t.now());
108
+ };
109
+ // Fire 4 concurrent acquisitions; each reserves its slot synchronously.
110
+ const waits = [grab(), grab(), grab(), grab()];
111
+ await t.tick(5000);
112
+ await Promise.all(waits);
113
+ expect(slots).toEqual([1_000_000, 1_001_000, 1_002_000, 1_003_000]);
114
+ });
115
+
116
+ it('adds jitter to pacing when configured', async () => {
117
+ const t = virtualTime();
118
+ const g = new RateLimitGate({ minIntervalMs: 1000, jitterRatio: 0.5, now: t.now, sleep: t.sleep, random: () => 0.5 });
119
+ const p1 = g.acquire();
120
+ const p2 = g.acquire();
121
+ await t.tick(2000);
122
+ await Promise.all([p1, p2]);
123
+ const state = await g.getState();
124
+ // Each reservation advances by interval + jitter (1000 + 250 = 1250);
125
+ // two reservations -> cursor at start + 2500.
126
+ expect(state.nextAllowedAt).toBe(1_000_000 + 2500);
127
+ });
128
+ });
129
+
130
+ describe('RateLimitGate 429 handling', () => {
131
+ it('honors Retry-After as a floor', async () => {
132
+ const { g } = gate();
133
+ const { waitMs } = await g.reportRateLimited('30');
134
+ // floor ladder 60s beats the 30s hint
135
+ expect(waitMs).toBe(60_000);
136
+ const { waitMs: wait2 } = await g.reportRateLimited('999');
137
+ expect(wait2).toBe(999_000);
138
+ });
139
+
140
+ it('escalates 60 -> 120 -> 240 -> 480 and caps at maxCooldown', async () => {
141
+ const { g } = gate({ maxCooldownMs: 300_000 });
142
+ expect((await g.reportRateLimited(null)).waitMs).toBe(60_000);
143
+ expect((await g.reportRateLimited(null)).waitMs).toBe(120_000);
144
+ expect((await g.reportRateLimited(null)).waitMs).toBe(240_000);
145
+ expect((await g.reportRateLimited(null)).waitMs).toBe(300_000); // capped
146
+ });
147
+
148
+ it('parks the whole client: a second request waits at the gate during cooldown', async () => {
149
+ const { g, t } = gate();
150
+ await g.reportRateLimited('60');
151
+ const p = g.acquire();
152
+ let resolved = false;
153
+ p.then(() => (resolved = true));
154
+ await t.tick(30_000);
155
+ await Promise.resolve();
156
+ expect(resolved).toBe(false);
157
+ await t.tick(40_000);
158
+ await expect(p).resolves.toBeDefined();
159
+ expect(resolved).toBe(true);
160
+ });
161
+
162
+ it('does not reset penalty after one success (decay needs a run of successes)', async () => {
163
+ const { g } = gate({ decaySuccesses: 5 });
164
+ await g.reportRateLimited(null);
165
+ await g.reportRateLimited(null);
166
+ const before = (await g.getStatus()).penaltyLevel;
167
+ await g.reportSuccess();
168
+ expect((await g.getStatus()).penaltyLevel).toBe(before);
169
+ for (let i = 0; i < 4; i++) await g.reportSuccess();
170
+ expect((await g.getStatus()).penaltyLevel).toBe(before - 1);
171
+ });
172
+ });
173
+
174
+ describe('RateLimitGate circuit breaker', () => {
175
+ it('opens at the threshold, fast-fails, then allows one half-open probe', async () => {
176
+ const { g, t } = gate({ openThreshold: 3 });
177
+ await g.reportRateLimited(null);
178
+ await g.reportRateLimited(null);
179
+ const { circuitOpened } = await g.reportRateLimited(null);
180
+ expect(circuitOpened).toBe(true);
181
+ expect((await g.getStatus()).circuitState).toBe('open');
182
+
183
+ // While cooldown is active, requests fail immediately (no thundering herd).
184
+ await expect(g.acquire()).rejects.toBeInstanceOf(PixivCircuitOpenError);
185
+
186
+ // Elapse cooldown: one caller becomes the probe...
187
+ t.advanceOnly(600_000);
188
+ const probe = await g.acquire();
189
+ expect(probe.probe).toBe(true);
190
+ expect((await g.getStatus()).circuitState).toBe('half_open');
191
+ // ...others are rejected while the probe is in flight.
192
+ await expect(g.acquire()).rejects.toBeInstanceOf(PixivCircuitOpenError);
193
+
194
+ // Probe succeeds -> closed.
195
+ await g.reportSuccess();
196
+ expect((await g.getStatus()).circuitState).toBe('closed');
197
+ });
198
+
199
+ it('reopens when the half-open probe fails', async () => {
200
+ const { g, t } = gate({ openThreshold: 1 });
201
+ await g.reportRateLimited(null);
202
+ t.advanceOnly(600_000);
203
+ await g.acquire(); // half-open probe
204
+ await g.reportProbeFailure(60_000);
205
+ expect((await g.getStatus()).circuitState).toBe('open');
206
+ });
207
+ });
208
+
209
+ describe('RateLimitGate persistence', () => {
210
+ it('persists state on 429 and restores the cooldown into a new gate', async () => {
211
+ const store = new MemoryRateLimitStateStore();
212
+ const { g, t } = gate({ stateStore: store, scope: 'acct-1' });
213
+ await g.reportRateLimited('60');
214
+ t.advanceOnly(5_000);
215
+
216
+ // New process, same store/scope: cooldown is remembered.
217
+ const t2 = virtualTime(t.now());
218
+ const g2 = new RateLimitGate({
219
+ stateStore: store,
220
+ scope: 'acct-1',
221
+ now: t2.now,
222
+ sleep: t2.sleep,
223
+ jitterRatio: 0,
224
+ random: () => 0,
225
+ });
226
+ const status = await g2.getStatus();
227
+ expect(status.cooldownRemainingMs).toBe(55_000);
228
+ expect(status.penaltyLevel).toBe(1);
229
+ // ...and acquiring after the cooldown elapses works (restart-safe).
230
+ t2.advanceOnly(55_000);
231
+ await expect(g2.acquire()).resolves.toEqual({ probe: false });
232
+ });
233
+
234
+ it('surfaces the persisted state shape for SQLite adapters', async () => {
235
+ const store = new MemoryRateLimitStateStore();
236
+ const { g } = gate({ stateStore: store });
237
+ await g.reportRateLimited(null);
238
+ const saved: RateLimitState | null = await store.load('default');
239
+ expect(saved).toMatchObject({
240
+ penaltyLevel: 1,
241
+ last429At: expect.any(Number),
242
+ circuitState: 'closed',
243
+ });
244
+ });
245
+ });
246
+
247
+ describe('RateLimitGate abort', () => {
248
+ it('rejects an aborted wait with an abort error', async () => {
249
+ const { g, t } = gate();
250
+ // consume the first immediate slot
251
+ void g.acquire();
252
+ const controller = new AbortController();
253
+ const p = g.acquire(controller.signal);
254
+ controller.abort();
255
+ await expect(p).rejects.toMatchObject({ name: 'PixivAbortError' });
256
+ void t;
257
+ });
258
+ });