monitor-transfer-dsh 0.0.0-stage → 0.1.2

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