@xrkseek/harness 0.2.3 → 0.2.5

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 (343) hide show
  1. package/node_modules/@xrkseek/core-tools/dist/index.d.ts +1 -0
  2. package/node_modules/@xrkseek/core-tools/dist/index.d.ts.map +1 -1
  3. package/node_modules/@xrkseek/core-tools/dist/index.js +1 -0
  4. package/node_modules/@xrkseek/core-tools/dist/index.js.map +1 -1
  5. package/node_modules/@xrkseek/core-tools/dist/settings-tools.d.ts +37 -0
  6. package/node_modules/@xrkseek/core-tools/dist/settings-tools.d.ts.map +1 -0
  7. package/node_modules/@xrkseek/core-tools/dist/settings-tools.js +161 -0
  8. package/node_modules/@xrkseek/core-tools/dist/settings-tools.js.map +1 -0
  9. package/node_modules/@xrkseek/core-tools/dist/std-tools.d.ts +4 -1
  10. package/node_modules/@xrkseek/core-tools/dist/std-tools.d.ts.map +1 -1
  11. package/node_modules/@xrkseek/core-tools/dist/std-tools.js +6 -1
  12. package/node_modules/@xrkseek/core-tools/dist/std-tools.js.map +1 -1
  13. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts +2 -2
  14. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts.map +1 -1
  15. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js +5 -6
  16. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js.map +1 -1
  17. package/node_modules/@xrkseek/exec-fs/dist/read-image.d.ts.map +1 -1
  18. package/node_modules/@xrkseek/exec-fs/dist/read-image.js +20 -2
  19. package/node_modules/@xrkseek/exec-fs/dist/read-image.js.map +1 -1
  20. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +5 -0
  21. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
  22. package/node_modules/@xrkseek/preset-harness/dist/preset.js +21 -8
  23. package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
  24. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  25. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  26. package/node_modules/@xrkseek/preset-server/dist/preset.d.ts +1 -0
  27. package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
  28. package/node_modules/@xrkseek/preset-server/dist/preset.js +12 -2
  29. package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
  30. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  31. package/node_modules/@xrkseek/preset-server/package.json +1 -0
  32. package/node_modules/@xrkseek/server-config/dist/index.d.ts +6 -2
  33. package/node_modules/@xrkseek/server-config/dist/index.d.ts.map +1 -1
  34. package/node_modules/@xrkseek/server-config/dist/index.js +17 -4
  35. package/node_modules/@xrkseek/server-config/dist/index.js.map +1 -1
  36. package/node_modules/@xrkseek/server-config/dist/mcp-servers.d.ts +12 -1
  37. package/node_modules/@xrkseek/server-config/dist/mcp-servers.d.ts.map +1 -1
  38. package/node_modules/@xrkseek/server-config/dist/mcp-servers.js +56 -1
  39. package/node_modules/@xrkseek/server-config/dist/mcp-servers.js.map +1 -1
  40. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts.map +1 -1
  41. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js +17 -1
  42. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js.map +1 -1
  43. package/node_modules/@xrkseek/server-face/dist/context.d.ts +8 -0
  44. package/node_modules/@xrkseek/server-face/dist/context.d.ts.map +1 -1
  45. package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
  46. package/node_modules/@xrkseek/server-face/dist/dispatch.js +4 -1
  47. package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
  48. package/node_modules/@xrkseek/server-face/dist/face-schema.d.ts.map +1 -1
  49. package/node_modules/@xrkseek/server-face/dist/face-schema.js +2 -0
  50. package/node_modules/@xrkseek/server-face/dist/face-schema.js.map +1 -1
  51. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.d.ts.map +1 -1
  52. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js +15 -1
  53. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js.map +1 -1
  54. package/node_modules/@xrkseek/server-face/dist/handlers/host.d.ts.map +1 -1
  55. package/node_modules/@xrkseek/server-face/dist/handlers/host.js +2 -0
  56. package/node_modules/@xrkseek/server-face/dist/handlers/host.js.map +1 -1
  57. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.d.ts +6 -0
  58. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.d.ts.map +1 -1
  59. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js +89 -1
  60. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js.map +1 -1
  61. package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
  62. package/node_modules/@xrkseek/server-face/dist/handlers/session.js +19 -113
  63. package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
  64. package/node_modules/@xrkseek/server-face/dist/index.d.ts +3 -2
  65. package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
  66. package/node_modules/@xrkseek/server-face/dist/index.js +3 -2
  67. package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
  68. package/node_modules/@xrkseek/server-face/dist/plugin-inventory.d.ts +22 -3
  69. package/node_modules/@xrkseek/server-face/dist/plugin-inventory.d.ts.map +1 -1
  70. package/node_modules/@xrkseek/server-face/dist/plugin-inventory.js +117 -6
  71. package/node_modules/@xrkseek/server-face/dist/plugin-inventory.js.map +1 -1
  72. package/node_modules/@xrkseek/server-face/dist/presets-catalog.d.ts +53 -6
  73. package/node_modules/@xrkseek/server-face/dist/presets-catalog.d.ts.map +1 -1
  74. package/node_modules/@xrkseek/server-face/dist/presets-catalog.js +100 -10
  75. package/node_modules/@xrkseek/server-face/dist/presets-catalog.js.map +1 -1
  76. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts +5 -0
  77. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
  78. package/node_modules/@xrkseek/server-face/dist/runtime.js +5 -0
  79. package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
  80. package/node_modules/@xrkseek/server-face/dist/select-session-model.d.ts +15 -0
  81. package/node_modules/@xrkseek/server-face/dist/select-session-model.d.ts.map +1 -0
  82. package/node_modules/@xrkseek/server-face/dist/select-session-model.js +117 -0
  83. package/node_modules/@xrkseek/server-face/dist/select-session-model.js.map +1 -0
  84. package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.d.ts +7 -0
  85. package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.d.ts.map +1 -0
  86. package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.js +91 -0
  87. package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.js.map +1 -0
  88. package/node_modules/@xrkseek/server-face/dist/settings-credentials.d.ts +7 -1
  89. package/node_modules/@xrkseek/server-face/dist/settings-credentials.d.ts.map +1 -1
  90. package/node_modules/@xrkseek/server-face/dist/settings-credentials.js +85 -26
  91. package/node_modules/@xrkseek/server-face/dist/settings-credentials.js.map +1 -1
  92. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  93. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +2 -1
  94. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  95. package/node_modules/@xrkseek/server-face/dist/slash.d.ts +8 -3
  96. package/node_modules/@xrkseek/server-face/dist/slash.d.ts.map +1 -1
  97. package/node_modules/@xrkseek/server-face/dist/slash.js +204 -21
  98. package/node_modules/@xrkseek/server-face/dist/slash.js.map +1 -1
  99. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts +7 -1
  100. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  101. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +27 -7
  102. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  103. package/node_modules/@xrkseek/server-host/dist/http-proxy.d.ts +11 -0
  104. package/node_modules/@xrkseek/server-host/dist/http-proxy.d.ts.map +1 -0
  105. package/node_modules/@xrkseek/server-host/dist/http-proxy.js +42 -0
  106. package/node_modules/@xrkseek/server-host/dist/http-proxy.js.map +1 -0
  107. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  108. package/node_modules/@xrkseek/server-host/dist/index.js +33 -6
  109. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  110. package/node_modules/@xrkseek/server-host/dist/mcp-wire.d.ts +4 -3
  111. package/node_modules/@xrkseek/server-host/dist/mcp-wire.d.ts.map +1 -1
  112. package/node_modules/@xrkseek/server-host/dist/mcp-wire.js +14 -10
  113. package/node_modules/@xrkseek/server-host/dist/mcp-wire.js.map +1 -1
  114. package/node_modules/@xrkseek/server-host/dist/standing-tools.d.ts.map +1 -1
  115. package/node_modules/@xrkseek/server-host/dist/standing-tools.js +11 -4
  116. package/node_modules/@xrkseek/server-host/dist/standing-tools.js.map +1 -1
  117. package/node_modules/@xrkseek/server-host/package.json +57 -56
  118. package/node_modules/@xrkseek/server-http/dist/index.d.ts +1 -0
  119. package/node_modules/@xrkseek/server-http/dist/index.d.ts.map +1 -1
  120. package/node_modules/@xrkseek/server-http/dist/index.js +1 -0
  121. package/node_modules/@xrkseek/server-http/dist/index.js.map +1 -1
  122. package/node_modules/@xrkseek/server-http/dist/sidebar/index.d.ts +7 -0
  123. package/node_modules/@xrkseek/server-http/dist/sidebar/index.d.ts.map +1 -1
  124. package/node_modules/@xrkseek/server-http/dist/sidebar/index.js.map +1 -1
  125. package/node_modules/@xrkseek/workspace/dist/index.d.ts +1 -1
  126. package/node_modules/@xrkseek/workspace/dist/index.d.ts.map +1 -1
  127. package/node_modules/@xrkseek/workspace/dist/index.js +1 -1
  128. package/node_modules/@xrkseek/workspace/dist/index.js.map +1 -1
  129. package/node_modules/@xrkseek/workspace/dist/recipes.d.ts +2 -0
  130. package/node_modules/@xrkseek/workspace/dist/recipes.d.ts.map +1 -1
  131. package/node_modules/@xrkseek/workspace/dist/recipes.js +9 -0
  132. package/node_modules/@xrkseek/workspace/dist/recipes.js.map +1 -1
  133. package/node_modules/undici/LICENSE +21 -0
  134. package/node_modules/undici/README.md +741 -0
  135. package/node_modules/undici/docs/docs/api/Agent.md +84 -0
  136. package/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  137. package/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  138. package/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
  139. package/node_modules/undici/docs/docs/api/Client.md +288 -0
  140. package/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
  141. package/node_modules/undici/docs/docs/api/Connector.md +115 -0
  142. package/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  143. package/node_modules/undici/docs/docs/api/Cookies.md +128 -0
  144. package/node_modules/undici/docs/docs/api/Debug.md +62 -0
  145. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +315 -0
  146. package/node_modules/undici/docs/docs/api/Dispatcher.md +1392 -0
  147. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
  148. package/node_modules/undici/docs/docs/api/Errors.md +49 -0
  149. package/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  150. package/node_modules/undici/docs/docs/api/Fetch.md +60 -0
  151. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
  152. package/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
  153. package/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
  154. package/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
  155. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
  156. package/node_modules/undici/docs/docs/api/MockClient.md +81 -0
  157. package/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  158. package/node_modules/undici/docs/docs/api/MockPool.md +555 -0
  159. package/node_modules/undici/docs/docs/api/Pool.md +84 -0
  160. package/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  161. package/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
  162. package/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
  163. package/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
  164. package/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
  165. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
  166. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
  167. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +275 -0
  168. package/node_modules/undici/docs/docs/api/Util.md +25 -0
  169. package/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
  170. package/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  171. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  172. package/node_modules/undici/docs/docs/best-practices/crawling.md +58 -0
  173. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
  174. package/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  175. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +224 -0
  176. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
  177. package/node_modules/undici/index-fetch.js +65 -0
  178. package/node_modules/undici/index.d.ts +3 -0
  179. package/node_modules/undici/index.js +234 -0
  180. package/node_modules/undici/lib/api/abort-signal.js +59 -0
  181. package/node_modules/undici/lib/api/api-connect.js +110 -0
  182. package/node_modules/undici/lib/api/api-pipeline.js +252 -0
  183. package/node_modules/undici/lib/api/api-request.js +214 -0
  184. package/node_modules/undici/lib/api/api-stream.js +209 -0
  185. package/node_modules/undici/lib/api/api-upgrade.js +111 -0
  186. package/node_modules/undici/lib/api/index.js +7 -0
  187. package/node_modules/undici/lib/api/readable.js +580 -0
  188. package/node_modules/undici/lib/cache/memory-cache-store.js +279 -0
  189. package/node_modules/undici/lib/cache/sqlite-cache-store.js +467 -0
  190. package/node_modules/undici/lib/core/connect.js +153 -0
  191. package/node_modules/undici/lib/core/constants.js +143 -0
  192. package/node_modules/undici/lib/core/diagnostics.js +227 -0
  193. package/node_modules/undici/lib/core/errors.js +477 -0
  194. package/node_modules/undici/lib/core/request.js +464 -0
  195. package/node_modules/undici/lib/core/socks5-client.js +422 -0
  196. package/node_modules/undici/lib/core/socks5-utils.js +212 -0
  197. package/node_modules/undici/lib/core/symbols.js +75 -0
  198. package/node_modules/undici/lib/core/tree.js +160 -0
  199. package/node_modules/undici/lib/core/util.js +992 -0
  200. package/node_modules/undici/lib/dispatcher/agent.js +158 -0
  201. package/node_modules/undici/lib/dispatcher/balanced-pool.js +221 -0
  202. package/node_modules/undici/lib/dispatcher/client-h1.js +1739 -0
  203. package/node_modules/undici/lib/dispatcher/client-h2.js +1051 -0
  204. package/node_modules/undici/lib/dispatcher/client.js +668 -0
  205. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +184 -0
  206. package/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
  207. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
  208. package/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
  209. package/node_modules/undici/lib/dispatcher/h2c-client.js +51 -0
  210. package/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
  211. package/node_modules/undici/lib/dispatcher/pool.js +118 -0
  212. package/node_modules/undici/lib/dispatcher/proxy-agent.js +319 -0
  213. package/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  214. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +137 -0
  215. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +260 -0
  216. package/node_modules/undici/lib/encoding/index.js +33 -0
  217. package/node_modules/undici/lib/global.js +59 -0
  218. package/node_modules/undici/lib/handler/cache-handler.js +776 -0
  219. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +124 -0
  220. package/node_modules/undici/lib/handler/decorator-handler.js +67 -0
  221. package/node_modules/undici/lib/handler/deduplication-handler.js +460 -0
  222. package/node_modules/undici/lib/handler/redirect-handler.js +238 -0
  223. package/node_modules/undici/lib/handler/retry-handler.js +453 -0
  224. package/node_modules/undici/lib/handler/unwrap-handler.js +106 -0
  225. package/node_modules/undici/lib/handler/wrap-handler.js +105 -0
  226. package/node_modules/undici/lib/interceptor/cache.js +621 -0
  227. package/node_modules/undici/lib/interceptor/decompress.js +391 -0
  228. package/node_modules/undici/lib/interceptor/deduplicate.js +117 -0
  229. package/node_modules/undici/lib/interceptor/dns.js +571 -0
  230. package/node_modules/undici/lib/interceptor/dump.js +99 -0
  231. package/node_modules/undici/lib/interceptor/redirect.js +21 -0
  232. package/node_modules/undici/lib/interceptor/response-error.js +95 -0
  233. package/node_modules/undici/lib/interceptor/retry.js +19 -0
  234. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  235. package/node_modules/undici/lib/llhttp/constants.d.ts +195 -0
  236. package/node_modules/undici/lib/llhttp/constants.js +531 -0
  237. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
  238. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
  239. package/node_modules/undici/lib/llhttp/utils.d.ts +2 -0
  240. package/node_modules/undici/lib/llhttp/utils.js +12 -0
  241. package/node_modules/undici/lib/mock/mock-agent.js +232 -0
  242. package/node_modules/undici/lib/mock/mock-call-history.js +248 -0
  243. package/node_modules/undici/lib/mock/mock-client.js +68 -0
  244. package/node_modules/undici/lib/mock/mock-errors.js +29 -0
  245. package/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
  246. package/node_modules/undici/lib/mock/mock-pool.js +68 -0
  247. package/node_modules/undici/lib/mock/mock-symbols.js +32 -0
  248. package/node_modules/undici/lib/mock/mock-utils.js +486 -0
  249. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  250. package/node_modules/undici/lib/mock/snapshot-agent.js +353 -0
  251. package/node_modules/undici/lib/mock/snapshot-recorder.js +588 -0
  252. package/node_modules/undici/lib/mock/snapshot-utils.js +158 -0
  253. package/node_modules/undici/lib/util/cache.js +676 -0
  254. package/node_modules/undici/lib/util/date.js +670 -0
  255. package/node_modules/undici/lib/util/promise.js +28 -0
  256. package/node_modules/undici/lib/util/runtime-features.js +124 -0
  257. package/node_modules/undici/lib/util/stats.js +32 -0
  258. package/node_modules/undici/lib/util/timers.js +425 -0
  259. package/node_modules/undici/lib/web/cache/cache.js +864 -0
  260. package/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  261. package/node_modules/undici/lib/web/cache/util.js +45 -0
  262. package/node_modules/undici/lib/web/cookies/constants.js +12 -0
  263. package/node_modules/undici/lib/web/cookies/index.js +199 -0
  264. package/node_modules/undici/lib/web/cookies/parse.js +314 -0
  265. package/node_modules/undici/lib/web/cookies/util.js +352 -0
  266. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +494 -0
  267. package/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
  268. package/node_modules/undici/lib/web/eventsource/util.js +29 -0
  269. package/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  270. package/node_modules/undici/lib/web/fetch/body.js +509 -0
  271. package/node_modules/undici/lib/web/fetch/constants.js +131 -0
  272. package/node_modules/undici/lib/web/fetch/data-url.js +596 -0
  273. package/node_modules/undici/lib/web/fetch/formdata-parser.js +586 -0
  274. package/node_modules/undici/lib/web/fetch/formdata.js +259 -0
  275. package/node_modules/undici/lib/web/fetch/global.js +40 -0
  276. package/node_modules/undici/lib/web/fetch/headers.js +719 -0
  277. package/node_modules/undici/lib/web/fetch/index.js +2413 -0
  278. package/node_modules/undici/lib/web/fetch/request.js +1115 -0
  279. package/node_modules/undici/lib/web/fetch/response.js +641 -0
  280. package/node_modules/undici/lib/web/fetch/util.js +1522 -0
  281. package/node_modules/undici/lib/web/infra/index.js +229 -0
  282. package/node_modules/undici/lib/web/subresource-integrity/Readme.md +9 -0
  283. package/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +307 -0
  284. package/node_modules/undici/lib/web/webidl/index.js +1006 -0
  285. package/node_modules/undici/lib/web/websocket/connection.js +329 -0
  286. package/node_modules/undici/lib/web/websocket/constants.js +126 -0
  287. package/node_modules/undici/lib/web/websocket/events.js +331 -0
  288. package/node_modules/undici/lib/web/websocket/frame.js +133 -0
  289. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +105 -0
  290. package/node_modules/undici/lib/web/websocket/receiver.js +507 -0
  291. package/node_modules/undici/lib/web/websocket/sender.js +109 -0
  292. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +104 -0
  293. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +496 -0
  294. package/node_modules/undici/lib/web/websocket/util.js +347 -0
  295. package/node_modules/undici/lib/web/websocket/websocket.js +758 -0
  296. package/node_modules/undici/package.json +152 -0
  297. package/node_modules/undici/scripts/strip-comments.js +10 -0
  298. package/node_modules/undici/types/README.md +6 -0
  299. package/node_modules/undici/types/agent.d.ts +32 -0
  300. package/node_modules/undici/types/api.d.ts +43 -0
  301. package/node_modules/undici/types/balanced-pool.d.ts +30 -0
  302. package/node_modules/undici/types/cache-interceptor.d.ts +179 -0
  303. package/node_modules/undici/types/cache.d.ts +36 -0
  304. package/node_modules/undici/types/client-stats.d.ts +15 -0
  305. package/node_modules/undici/types/client.d.ts +139 -0
  306. package/node_modules/undici/types/connector.d.ts +36 -0
  307. package/node_modules/undici/types/content-type.d.ts +21 -0
  308. package/node_modules/undici/types/cookies.d.ts +30 -0
  309. package/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
  310. package/node_modules/undici/types/dispatcher.d.ts +275 -0
  311. package/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
  312. package/node_modules/undici/types/errors.d.ts +177 -0
  313. package/node_modules/undici/types/eventsource.d.ts +66 -0
  314. package/node_modules/undici/types/fetch.d.ts +231 -0
  315. package/node_modules/undici/types/formdata.d.ts +114 -0
  316. package/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  317. package/node_modules/undici/types/global-origin.d.ts +7 -0
  318. package/node_modules/undici/types/h2c-client.d.ts +73 -0
  319. package/node_modules/undici/types/handlers.d.ts +14 -0
  320. package/node_modules/undici/types/header.d.ts +160 -0
  321. package/node_modules/undici/types/index.d.ts +91 -0
  322. package/node_modules/undici/types/interceptors.d.ts +82 -0
  323. package/node_modules/undici/types/mock-agent.d.ts +68 -0
  324. package/node_modules/undici/types/mock-call-history.d.ts +111 -0
  325. package/node_modules/undici/types/mock-client.d.ts +27 -0
  326. package/node_modules/undici/types/mock-errors.d.ts +12 -0
  327. package/node_modules/undici/types/mock-interceptor.d.ts +94 -0
  328. package/node_modules/undici/types/mock-pool.d.ts +27 -0
  329. package/node_modules/undici/types/patch.d.ts +29 -0
  330. package/node_modules/undici/types/pool-stats.d.ts +19 -0
  331. package/node_modules/undici/types/pool.d.ts +41 -0
  332. package/node_modules/undici/types/proxy-agent.d.ts +29 -0
  333. package/node_modules/undici/types/readable.d.ts +68 -0
  334. package/node_modules/undici/types/retry-agent.d.ts +8 -0
  335. package/node_modules/undici/types/retry-handler.d.ts +125 -0
  336. package/node_modules/undici/types/round-robin-pool.d.ts +41 -0
  337. package/node_modules/undici/types/snapshot-agent.d.ts +109 -0
  338. package/node_modules/undici/types/socks5-proxy-agent.d.ts +25 -0
  339. package/node_modules/undici/types/util.d.ts +18 -0
  340. package/node_modules/undici/types/utility.d.ts +7 -0
  341. package/node_modules/undici/types/webidl.d.ts +347 -0
  342. package/node_modules/undici/types/websocket.d.ts +188 -0
  343. package/package.json +3 -1
@@ -0,0 +1,238 @@
1
+ 'use strict'
2
+
3
+ const util = require('../core/util')
4
+ const { kBodyUsed } = require('../core/symbols')
5
+ const assert = require('node:assert')
6
+ const { InvalidArgumentError } = require('../core/errors')
7
+ const EE = require('node:events')
8
+
9
+ const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]
10
+
11
+ const kBody = Symbol('body')
12
+
13
+ const noop = () => {}
14
+
15
+ class BodyAsyncIterable {
16
+ constructor (body) {
17
+ this[kBody] = body
18
+ this[kBodyUsed] = false
19
+ }
20
+
21
+ async * [Symbol.asyncIterator] () {
22
+ assert(!this[kBodyUsed], 'disturbed')
23
+ this[kBodyUsed] = true
24
+ yield * this[kBody]
25
+ }
26
+ }
27
+
28
+ class RedirectHandler {
29
+ static buildDispatch (dispatcher, maxRedirections) {
30
+ if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
31
+ throw new InvalidArgumentError('maxRedirections must be a positive number')
32
+ }
33
+
34
+ const dispatch = dispatcher.dispatch.bind(dispatcher)
35
+ return (opts, originalHandler) => dispatch(opts, new RedirectHandler(dispatch, maxRedirections, opts, originalHandler))
36
+ }
37
+
38
+ constructor (dispatch, maxRedirections, opts, handler) {
39
+ if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
40
+ throw new InvalidArgumentError('maxRedirections must be a positive number')
41
+ }
42
+
43
+ this.dispatch = dispatch
44
+ this.location = null
45
+ const { maxRedirections: _, ...cleanOpts } = opts
46
+ this.opts = cleanOpts // opts must be a copy, exclude maxRedirections
47
+ this.maxRedirections = maxRedirections
48
+ this.handler = handler
49
+ this.history = []
50
+
51
+ if (util.isStream(this.opts.body)) {
52
+ // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp
53
+ // so that it can be dispatched again?
54
+ // TODO (fix): Do we need 100-expect support to provide a way to do this properly?
55
+ if (util.bodyLength(this.opts.body) === 0) {
56
+ this.opts.body
57
+ .on('data', function () {
58
+ assert(false)
59
+ })
60
+ }
61
+
62
+ if (typeof this.opts.body.readableDidRead !== 'boolean') {
63
+ this.opts.body[kBodyUsed] = false
64
+ EE.prototype.on.call(this.opts.body, 'data', function () {
65
+ this[kBodyUsed] = true
66
+ })
67
+ }
68
+ } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {
69
+ // TODO (fix): We can't access ReadableStream internal state
70
+ // to determine whether or not it has been disturbed. This is just
71
+ // a workaround.
72
+ this.opts.body = new BodyAsyncIterable(this.opts.body)
73
+ } else if (
74
+ this.opts.body &&
75
+ typeof this.opts.body !== 'string' &&
76
+ !ArrayBuffer.isView(this.opts.body) &&
77
+ util.isIterable(this.opts.body) &&
78
+ !util.isFormDataLike(this.opts.body)
79
+ ) {
80
+ // TODO: Should we allow re-using iterable if !this.opts.idempotent
81
+ // or through some other flag?
82
+ this.opts.body = new BodyAsyncIterable(this.opts.body)
83
+ }
84
+ }
85
+
86
+ onRequestStart (controller, context) {
87
+ this.handler.onRequestStart?.(controller, { ...context, history: this.history })
88
+ }
89
+
90
+ onRequestUpgrade (controller, statusCode, headers, socket) {
91
+ this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)
92
+ }
93
+
94
+ onResponseStart (controller, statusCode, headers, statusMessage) {
95
+ if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
96
+ throw new Error('max redirects')
97
+ }
98
+
99
+ // https://tools.ietf.org/html/rfc7231#section-6.4.2
100
+ // https://fetch.spec.whatwg.org/#http-redirect-fetch
101
+ // In case of HTTP 301 or 302 with POST, change the method to GET
102
+ if ((statusCode === 301 || statusCode === 302) && this.opts.method === 'POST') {
103
+ this.opts.method = 'GET'
104
+ if (util.isStream(this.opts.body)) {
105
+ util.destroy(this.opts.body.on('error', noop))
106
+ }
107
+ this.opts.body = null
108
+ }
109
+
110
+ // https://tools.ietf.org/html/rfc7231#section-6.4.4
111
+ // In case of HTTP 303, always replace method to be either HEAD or GET
112
+ if (statusCode === 303 && this.opts.method !== 'HEAD') {
113
+ this.opts.method = 'GET'
114
+ if (util.isStream(this.opts.body)) {
115
+ util.destroy(this.opts.body.on('error', noop))
116
+ }
117
+ this.opts.body = null
118
+ }
119
+
120
+ this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1
121
+ ? null
122
+ : headers.location
123
+
124
+ if (this.opts.origin) {
125
+ this.history.push(new URL(this.opts.path, this.opts.origin))
126
+ }
127
+
128
+ if (!this.location) {
129
+ this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
130
+ return
131
+ }
132
+
133
+ const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))
134
+ const path = search ? `${pathname}${search}` : pathname
135
+
136
+ // Check for redirect loops by seeing if we've already visited this URL in our history
137
+ // This catches the case where Client/Pool try to handle cross-origin redirects but fail
138
+ // and keep redirecting to the same URL in an infinite loop
139
+ const redirectUrlString = `${origin}${path}`
140
+ for (const historyUrl of this.history) {
141
+ if (historyUrl.toString() === redirectUrlString) {
142
+ throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`)
143
+ }
144
+ }
145
+
146
+ // Remove headers referring to the original URL.
147
+ // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.
148
+ // https://tools.ietf.org/html/rfc7231#section-6.4
149
+ this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)
150
+ this.opts.path = path
151
+ this.opts.origin = origin
152
+ this.opts.query = null
153
+ }
154
+
155
+ onResponseData (controller, chunk) {
156
+ if (this.location) {
157
+ /*
158
+ https://tools.ietf.org/html/rfc7231#section-6.4
159
+
160
+ TLDR: undici always ignores 3xx response bodies.
161
+
162
+ Redirection is used to serve the requested resource from another URL, so it assumes that
163
+ no body is generated (and thus can be ignored). Even though generating a body is not prohibited.
164
+
165
+ For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually
166
+ (which means it's optional and not mandated) contain just an hyperlink to the value of
167
+ the Location response header, so the body can be ignored safely.
168
+
169
+ For status 300, which is "Multiple Choices", the spec mentions both generating a Location
170
+ response header AND a response body with the other possible location to follow.
171
+ Since the spec explicitly chooses not to specify a format for such body and leave it to
172
+ servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.
173
+ */
174
+ } else {
175
+ this.handler.onResponseData?.(controller, chunk)
176
+ }
177
+ }
178
+
179
+ onResponseEnd (controller, trailers) {
180
+ if (this.location) {
181
+ /*
182
+ https://tools.ietf.org/html/rfc7231#section-6.4
183
+
184
+ TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections
185
+ and neither are useful if present.
186
+
187
+ See comment on onData method above for more detailed information.
188
+ */
189
+ this.dispatch(this.opts, this)
190
+ } else {
191
+ this.handler.onResponseEnd(controller, trailers)
192
+ }
193
+ }
194
+
195
+ onResponseError (controller, error) {
196
+ this.handler.onResponseError?.(controller, error)
197
+ }
198
+ }
199
+
200
+ // https://tools.ietf.org/html/rfc7231#section-6.4.4
201
+ function shouldRemoveHeader (header, removeContent, unknownOrigin) {
202
+ if (header.length === 4) {
203
+ return util.headerNameToString(header) === 'host'
204
+ }
205
+ if (removeContent && util.headerNameToString(header).startsWith('content-')) {
206
+ return true
207
+ }
208
+ if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {
209
+ const name = util.headerNameToString(header)
210
+ return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'
211
+ }
212
+ return false
213
+ }
214
+
215
+ // https://tools.ietf.org/html/rfc7231#section-6.4
216
+ function cleanRequestHeaders (headers, removeContent, unknownOrigin) {
217
+ const ret = []
218
+ if (Array.isArray(headers)) {
219
+ for (let i = 0; i < headers.length; i += 2) {
220
+ if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {
221
+ ret.push(headers[i], headers[i + 1])
222
+ }
223
+ }
224
+ } else if (headers && typeof headers === 'object') {
225
+ const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers)
226
+
227
+ for (const [key, value] of entries) {
228
+ if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
229
+ ret.push(key, value)
230
+ }
231
+ }
232
+ } else {
233
+ assert(headers == null, 'headers must be an object or an array')
234
+ }
235
+ return ret
236
+ }
237
+
238
+ module.exports = RedirectHandler
@@ -0,0 +1,453 @@
1
+ 'use strict'
2
+ const assert = require('node:assert')
3
+
4
+ const { kRetryHandlerDefaultRetry } = require('../core/symbols')
5
+ const { RequestRetryError } = require('../core/errors')
6
+ const WrapHandler = require('./wrap-handler')
7
+ const {
8
+ isDisturbed,
9
+ parseRangeHeader,
10
+ wrapRequestBody
11
+ } = require('../core/util')
12
+
13
+ function calculateRetryAfterHeader (retryAfter) {
14
+ const retryTime = new Date(retryAfter).getTime()
15
+ return isNaN(retryTime) ? 0 : retryTime - Date.now()
16
+ }
17
+
18
+ function validatePartialResponseContentLength (headers, range, statusCode, retryCount) {
19
+ const contentLength = headers['content-length']
20
+ if (contentLength == null) {
21
+ return
22
+ }
23
+
24
+ if (!Number.isFinite(range.start) || !Number.isFinite(range.end)) {
25
+ return
26
+ }
27
+
28
+ const length = Number(contentLength)
29
+ const expectedLength = range.end - range.start + 1
30
+ if (!Number.isFinite(length) || length !== expectedLength) {
31
+ throw new RequestRetryError('Content-Length mismatch', statusCode, {
32
+ headers,
33
+ data: { count: retryCount }
34
+ })
35
+ }
36
+ }
37
+
38
+ class RetryHandler {
39
+ constructor (opts, { dispatch, handler }) {
40
+ const { retryOptions, ...dispatchOpts } = opts
41
+ const {
42
+ // Retry scoped
43
+ retry: retryFn,
44
+ maxRetries,
45
+ maxTimeout,
46
+ minTimeout,
47
+ timeoutFactor,
48
+ // Response scoped
49
+ methods,
50
+ errorCodes,
51
+ retryAfter,
52
+ statusCodes,
53
+ throwOnError
54
+ } = retryOptions ?? {}
55
+
56
+ this.error = null
57
+ this.dispatch = dispatch
58
+ this.handler = WrapHandler.wrap(handler)
59
+ this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }
60
+ this.retryOpts = {
61
+ throwOnError: throwOnError ?? true,
62
+ retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
63
+ retryAfter: retryAfter ?? true,
64
+ maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
65
+ minTimeout: minTimeout ?? 500, // .5s
66
+ timeoutFactor: timeoutFactor ?? 2,
67
+ maxRetries: maxRetries ?? 5,
68
+ // What errors we should retry
69
+ methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],
70
+ // Indicates which errors to retry
71
+ statusCodes: statusCodes ?? [500, 502, 503, 504, 429],
72
+ // List of errors to retry
73
+ errorCodes: errorCodes ?? [
74
+ 'ECONNRESET',
75
+ 'ECONNREFUSED',
76
+ 'ENOTFOUND',
77
+ 'ENETDOWN',
78
+ 'ENETUNREACH',
79
+ 'EHOSTDOWN',
80
+ 'EHOSTUNREACH',
81
+ 'EPIPE',
82
+ 'UND_ERR_SOCKET'
83
+ ]
84
+ }
85
+
86
+ this.retryCount = 0
87
+ this.retryCountCheckpoint = 0
88
+ this.headersSent = false
89
+ this.start = 0
90
+ this.end = null
91
+ this.etag = null
92
+ }
93
+
94
+ onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {
95
+ if (this.retryOpts.throwOnError) {
96
+ // Preserve old behavior for status codes that are not eligible for retry
97
+ if (this.retryOpts.statusCodes.includes(statusCode) === false) {
98
+ if (this.headersSent) {
99
+ // The downstream handler already received the response from an
100
+ // earlier attempt. Forwarding this response would replace the
101
+ // downstream body and leave the original body pending forever.
102
+ this.handler.onResponseError?.(controller, err)
103
+ } else {
104
+ this.headersSent = true
105
+ this.checkpointResponseEnd(headers)
106
+ this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
107
+ }
108
+ } else {
109
+ this.error = err
110
+ }
111
+
112
+ return
113
+ }
114
+
115
+ if (isDisturbed(this.opts.body)) {
116
+ this.headersSent = true
117
+ this.checkpointResponseEnd(headers)
118
+ this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
119
+ return
120
+ }
121
+
122
+ function shouldRetry (passedErr) {
123
+ if (passedErr) {
124
+ if (this.headersSent) {
125
+ // The downstream handler already received the response from an
126
+ // earlier attempt. Forwarding this response would replace the
127
+ // downstream body and leave the original body pending forever.
128
+ this.handler.onResponseError?.(controller, passedErr)
129
+ } else {
130
+ this.headersSent = true
131
+ this.checkpointResponseEnd(headers)
132
+ this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
133
+ }
134
+ controller.resume()
135
+ return
136
+ }
137
+
138
+ this.error = err
139
+ controller.resume()
140
+ }
141
+
142
+ controller.pause()
143
+ this.retryOpts.retry(
144
+ err,
145
+ {
146
+ state: { counter: this.retryCount },
147
+ opts: { retryOptions: this.retryOpts, ...this.opts }
148
+ },
149
+ shouldRetry.bind(this)
150
+ )
151
+ }
152
+
153
+ checkpointResponseEnd (headers) {
154
+ if (this.end == null && this.opts.method !== 'HEAD') {
155
+ const contentLength = headers['content-length']
156
+ this.end = contentLength != null ? Number(contentLength) - 1 : null
157
+
158
+ assert(
159
+ this.end == null || Number.isFinite(this.end),
160
+ 'invalid content-length'
161
+ )
162
+
163
+ this.resume = this.end != null
164
+ }
165
+ }
166
+
167
+ onRequestStart (controller, context) {
168
+ if (!this.headersSent) {
169
+ this.handler.onRequestStart?.(controller, context)
170
+ }
171
+ }
172
+
173
+ onRequestUpgrade (controller, statusCode, headers, socket) {
174
+ this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket)
175
+ }
176
+
177
+ static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
178
+ const { statusCode, code, headers } = err
179
+ const { method, retryOptions } = opts
180
+ const {
181
+ maxRetries,
182
+ minTimeout,
183
+ maxTimeout,
184
+ timeoutFactor,
185
+ statusCodes,
186
+ errorCodes,
187
+ methods
188
+ } = retryOptions
189
+ const { counter } = state
190
+
191
+ // Any code that is not a Undici's originated and allowed to retry
192
+ if (code && code !== 'UND_ERR_REQ_RETRY' && !errorCodes.includes(code)) {
193
+ cb(err)
194
+ return
195
+ }
196
+
197
+ // If a set of method are provided and the current method is not in the list
198
+ if (Array.isArray(methods) && !methods.includes(method)) {
199
+ cb(err)
200
+ return
201
+ }
202
+
203
+ // If a set of status code are provided and the current status code is not in the list
204
+ if (
205
+ statusCode != null &&
206
+ Array.isArray(statusCodes) &&
207
+ !statusCodes.includes(statusCode)
208
+ ) {
209
+ cb(err)
210
+ return
211
+ }
212
+
213
+ // If we reached the max number of retries
214
+ if (counter > maxRetries) {
215
+ cb(err)
216
+ return
217
+ }
218
+
219
+ let retryAfterHeader = headers?.['retry-after']
220
+ if (retryAfterHeader) {
221
+ retryAfterHeader = Number(retryAfterHeader)
222
+ retryAfterHeader = Number.isNaN(retryAfterHeader)
223
+ ? calculateRetryAfterHeader(headers['retry-after'])
224
+ : retryAfterHeader * 1e3 // Retry-After is in seconds
225
+ }
226
+
227
+ const retryTimeout =
228
+ retryAfterHeader > 0
229
+ ? Math.min(retryAfterHeader, maxTimeout)
230
+ : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
231
+
232
+ setTimeout(() => cb(null), retryTimeout)
233
+ }
234
+
235
+ onResponseStart (controller, statusCode, headers, statusMessage) {
236
+ this.error = null
237
+ this.retryCount += 1
238
+
239
+ if (statusCode >= 300) {
240
+ const err = new RequestRetryError('Request failed', statusCode, {
241
+ headers,
242
+ data: {
243
+ count: this.retryCount
244
+ }
245
+ })
246
+
247
+ this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err)
248
+ return
249
+ }
250
+
251
+ // Checkpoint for resume from where we left it
252
+ if (this.headersSent) {
253
+ // Only Partial Content 206 supposed to provide Content-Range,
254
+ // any other status code that partially consumed the payload
255
+ // should not be retried because it would result in downstream
256
+ // wrongly concatenate multiple responses.
257
+ if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) {
258
+ throw new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, {
259
+ headers,
260
+ data: { count: this.retryCount }
261
+ })
262
+ }
263
+
264
+ const contentRange = parseRangeHeader(headers['content-range'])
265
+ // If no content range
266
+ if (!contentRange) {
267
+ // We always throw here as we want to indicate that we entred unexpected path
268
+ throw new RequestRetryError('Content-Range mismatch', statusCode, {
269
+ headers,
270
+ data: { count: this.retryCount }
271
+ })
272
+ }
273
+
274
+ // Let's start with a weak etag check
275
+ if (this.etag != null && this.etag !== headers.etag) {
276
+ // We always throw here as we want to indicate that we entred unexpected path
277
+ throw new RequestRetryError('ETag mismatch', statusCode, {
278
+ headers,
279
+ data: { count: this.retryCount }
280
+ })
281
+ }
282
+
283
+ validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount)
284
+
285
+ const { start, size, end = size ? size - 1 : null } = contentRange
286
+
287
+ if (this.start !== start || (this.end != null && this.end !== end)) {
288
+ throw new RequestRetryError('Content-Range mismatch', statusCode, {
289
+ headers,
290
+ data: { count: this.retryCount }
291
+ })
292
+ }
293
+
294
+ return
295
+ }
296
+
297
+ if (this.end == null) {
298
+ if (statusCode === 206) {
299
+ // First time we receive 206
300
+ const range = parseRangeHeader(headers['content-range'])
301
+
302
+ if (range == null) {
303
+ this.headersSent = true
304
+ this.handler.onResponseStart?.(
305
+ controller,
306
+ statusCode,
307
+ headers,
308
+ statusMessage
309
+ )
310
+ return
311
+ }
312
+
313
+ validatePartialResponseContentLength(headers, range, statusCode, this.retryCount)
314
+
315
+ const { start, size, end = size ? size - 1 : null } = range
316
+ assert(
317
+ start != null && Number.isFinite(start),
318
+ 'content-range mismatch'
319
+ )
320
+ assert(end != null && Number.isFinite(end), 'invalid content-length')
321
+
322
+ this.start = start
323
+ this.end = end
324
+ }
325
+
326
+ // We make our best to checkpoint the body for further range headers
327
+ if (this.end == null) {
328
+ const contentLength = headers['content-length']
329
+ this.end = contentLength != null ? Number(contentLength) - 1 : null
330
+ }
331
+
332
+ assert(Number.isFinite(this.start))
333
+ assert(
334
+ this.end == null || Number.isFinite(this.end),
335
+ 'invalid content-length'
336
+ )
337
+
338
+ this.resume = true
339
+ this.etag = headers.etag != null ? headers.etag : null
340
+
341
+ // Weak etags are not useful for comparison nor cache
342
+ // for instance not safe to assume if the response is byte-per-byte
343
+ // equal
344
+ if (
345
+ this.etag != null &&
346
+ this.etag[0] === 'W' &&
347
+ this.etag[1] === '/'
348
+ ) {
349
+ this.etag = null
350
+ }
351
+
352
+ this.headersSent = true
353
+ this.handler.onResponseStart?.(
354
+ controller,
355
+ statusCode,
356
+ headers,
357
+ statusMessage
358
+ )
359
+ } else {
360
+ throw new RequestRetryError('Request failed', statusCode, {
361
+ headers,
362
+ data: { count: this.retryCount }
363
+ })
364
+ }
365
+ }
366
+
367
+ onResponseData (controller, chunk) {
368
+ if (this.error) {
369
+ return
370
+ }
371
+
372
+ this.start += chunk.length
373
+
374
+ this.handler.onResponseData?.(controller, chunk)
375
+ }
376
+
377
+ onResponseEnd (controller, trailers) {
378
+ if (this.error && this.retryOpts.throwOnError) {
379
+ throw this.error
380
+ }
381
+
382
+ if (!this.error) {
383
+ this.retryCount = 0
384
+ return this.handler.onResponseEnd?.(controller, trailers)
385
+ }
386
+
387
+ this.retry(controller)
388
+ }
389
+
390
+ retry (controller) {
391
+ if (this.start !== 0) {
392
+ const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }
393
+
394
+ // Weak etag check - weak etags will make comparison algorithms never match
395
+ if (this.etag != null) {
396
+ headers['if-match'] = this.etag
397
+ }
398
+
399
+ this.opts = {
400
+ ...this.opts,
401
+ headers: {
402
+ ...this.opts.headers,
403
+ ...headers
404
+ }
405
+ }
406
+ }
407
+
408
+ try {
409
+ this.retryCountCheckpoint = this.retryCount
410
+ this.dispatch(this.opts, this)
411
+ } catch (err) {
412
+ this.handler.onResponseError?.(controller, err)
413
+ }
414
+ }
415
+
416
+ onResponseError (controller, err) {
417
+ if (controller?.aborted || isDisturbed(this.opts.body) || (this.headersSent && !this.resume)) {
418
+ this.handler.onResponseError?.(controller, err)
419
+ return
420
+ }
421
+
422
+ function shouldRetry (returnedErr) {
423
+ if (!returnedErr) {
424
+ this.retry(controller)
425
+ return
426
+ }
427
+
428
+ this.handler?.onResponseError?.(controller, returnedErr)
429
+ }
430
+
431
+ // We reconcile in case of a mix between network errors
432
+ // and server error response
433
+ if (this.retryCount - this.retryCountCheckpoint > 0) {
434
+ // We count the difference between the last checkpoint and the current retry count
435
+ this.retryCount =
436
+ this.retryCountCheckpoint +
437
+ (this.retryCount - this.retryCountCheckpoint)
438
+ } else {
439
+ this.retryCount += 1
440
+ }
441
+
442
+ this.retryOpts.retry(
443
+ err,
444
+ {
445
+ state: { counter: this.retryCount },
446
+ opts: { retryOptions: this.retryOpts, ...this.opts }
447
+ },
448
+ shouldRetry.bind(this)
449
+ )
450
+ }
451
+ }
452
+
453
+ module.exports = RetryHandler