@pnpm/exe 12.0.0-beta.2 → 12.0.0-beta.4

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 (426) hide show
  1. package/dist/node-gyp-bin/node-gyp +6 -0
  2. package/dist/node-gyp-bin/node-gyp.cmd +5 -0
  3. package/dist/node_modules/.bin/node-gyp +38 -0
  4. package/dist/node_modules/.bin/node-which +38 -0
  5. package/dist/node_modules/.bin/nopt +38 -0
  6. package/dist/node_modules/.bin/semver +38 -0
  7. package/dist/node_modules/.package-map.json +1 -0
  8. package/dist/node_modules/.pnpm-workspace-state-v1.json +293 -0
  9. package/dist/node_modules/@isaacs/fs-minipass/LICENSE +15 -0
  10. package/dist/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js +430 -0
  11. package/dist/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json +3 -0
  12. package/dist/node_modules/@isaacs/fs-minipass/dist/esm/index.js +420 -0
  13. package/dist/node_modules/@isaacs/fs-minipass/dist/esm/package.json +3 -0
  14. package/dist/node_modules/@isaacs/fs-minipass/package.json +72 -0
  15. package/dist/node_modules/abbrev/LICENSE +46 -0
  16. package/dist/node_modules/abbrev/lib/index.js +53 -0
  17. package/dist/node_modules/abbrev/package.json +41 -0
  18. package/dist/node_modules/chownr/dist/commonjs/index.js +93 -0
  19. package/dist/node_modules/chownr/dist/commonjs/package.json +3 -0
  20. package/dist/node_modules/chownr/dist/esm/index.js +85 -0
  21. package/dist/node_modules/chownr/dist/esm/package.json +3 -0
  22. package/dist/node_modules/chownr/package.json +69 -0
  23. package/dist/node_modules/env-paths/index.js +74 -0
  24. package/dist/node_modules/env-paths/license +9 -0
  25. package/dist/node_modules/env-paths/package.json +45 -0
  26. package/dist/node_modules/exponential-backoff/LICENSE +202 -0
  27. package/dist/node_modules/exponential-backoff/dist/backoff.js +124 -0
  28. package/dist/node_modules/exponential-backoff/dist/delay/always/always.delay.js +25 -0
  29. package/dist/node_modules/exponential-backoff/dist/delay/delay.base.js +45 -0
  30. package/dist/node_modules/exponential-backoff/dist/delay/delay.factory.js +17 -0
  31. package/dist/node_modules/exponential-backoff/dist/delay/delay.interface.js +3 -0
  32. package/dist/node_modules/exponential-backoff/dist/delay/skip-first/skip-first.delay.js +82 -0
  33. package/dist/node_modules/exponential-backoff/dist/jitter/full/full.jitter.js +8 -0
  34. package/dist/node_modules/exponential-backoff/dist/jitter/jitter.factory.js +15 -0
  35. package/dist/node_modules/exponential-backoff/dist/jitter/no/no.jitter.js +7 -0
  36. package/dist/node_modules/exponential-backoff/dist/options.js +31 -0
  37. package/dist/node_modules/exponential-backoff/package.json +62 -0
  38. package/dist/node_modules/fdir/LICENSE +7 -0
  39. package/dist/node_modules/fdir/dist/index.cjs +588 -0
  40. package/dist/node_modules/fdir/dist/index.d.cts +155 -0
  41. package/dist/node_modules/fdir/dist/index.d.mts +155 -0
  42. package/dist/node_modules/fdir/dist/index.mjs +570 -0
  43. package/dist/node_modules/fdir/package.json +103 -0
  44. package/dist/node_modules/graceful-fs/LICENSE +15 -0
  45. package/dist/node_modules/graceful-fs/clone.js +23 -0
  46. package/dist/node_modules/graceful-fs/graceful-fs.js +448 -0
  47. package/dist/node_modules/graceful-fs/legacy-streams.js +118 -0
  48. package/dist/node_modules/graceful-fs/package.json +53 -0
  49. package/dist/node_modules/graceful-fs/polyfills.js +355 -0
  50. package/dist/node_modules/isexe/dist/commonjs/index.js +56 -0
  51. package/dist/node_modules/isexe/dist/commonjs/index.min.js +2 -0
  52. package/dist/node_modules/isexe/dist/commonjs/options.js +3 -0
  53. package/dist/node_modules/isexe/dist/commonjs/package.json +3 -0
  54. package/dist/node_modules/isexe/dist/commonjs/posix.js +67 -0
  55. package/dist/node_modules/isexe/dist/commonjs/win32.js +63 -0
  56. package/dist/node_modules/isexe/dist/esm/index.js +16 -0
  57. package/dist/node_modules/isexe/dist/esm/index.min.js +2 -0
  58. package/dist/node_modules/isexe/dist/esm/options.js +2 -0
  59. package/dist/node_modules/isexe/dist/esm/package.json +3 -0
  60. package/dist/node_modules/isexe/dist/esm/posix.js +62 -0
  61. package/dist/node_modules/isexe/dist/esm/win32.js +58 -0
  62. package/dist/node_modules/isexe/package.json +78 -0
  63. package/dist/node_modules/minipass/dist/commonjs/index.js +1038 -0
  64. package/dist/node_modules/minipass/dist/commonjs/package.json +3 -0
  65. package/dist/node_modules/minipass/dist/esm/index.js +1020 -0
  66. package/dist/node_modules/minipass/dist/esm/package.json +3 -0
  67. package/dist/node_modules/minipass/package.json +77 -0
  68. package/dist/node_modules/minizlib/LICENSE +26 -0
  69. package/dist/node_modules/minizlib/dist/commonjs/constants.js +123 -0
  70. package/dist/node_modules/minizlib/dist/commonjs/index.js +416 -0
  71. package/dist/node_modules/minizlib/dist/commonjs/package.json +3 -0
  72. package/dist/node_modules/minizlib/dist/esm/constants.js +117 -0
  73. package/dist/node_modules/minizlib/dist/esm/index.js +363 -0
  74. package/dist/node_modules/minizlib/dist/esm/package.json +3 -0
  75. package/dist/node_modules/minizlib/package.json +80 -0
  76. package/dist/node_modules/node-gyp/.release-please-manifest.json +3 -0
  77. package/dist/node_modules/node-gyp/LICENSE +24 -0
  78. package/dist/node_modules/node-gyp/addon.gypi +204 -0
  79. package/dist/node_modules/node-gyp/bin/node-gyp.js +145 -0
  80. package/dist/node_modules/node-gyp/eslint.config.js +3 -0
  81. package/dist/node_modules/node-gyp/gyp/.release-please-manifest.json +3 -0
  82. package/dist/node_modules/node-gyp/gyp/LICENSE +28 -0
  83. package/dist/node_modules/node-gyp/gyp/data/ninja/build.ninja +4 -0
  84. package/dist/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc +12 -0
  85. package/dist/node_modules/node-gyp/gyp/gyp +8 -0
  86. package/dist/node_modules/node-gyp/gyp/gyp.bat +5 -0
  87. package/dist/node_modules/node-gyp/gyp/gyp_main.py +45 -0
  88. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +365 -0
  89. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
  90. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1283 -0
  91. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1545 -0
  92. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
  93. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +152 -0
  94. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +270 -0
  95. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +607 -0
  96. package/dist/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +706 -0
  97. package/dist/node_modules/node-gyp/gyp/pylib/gyp/common.py +725 -0
  98. package/dist/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +186 -0
  99. package/dist/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +170 -0
  100. package/dist/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +113 -0
  101. package/dist/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
  102. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  103. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +805 -0
  104. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1169 -0
  105. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1316 -0
  106. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +128 -0
  107. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +104 -0
  108. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +461 -0
  109. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +88 -0
  110. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +55 -0
  111. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2755 -0
  112. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3970 -0
  113. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
  114. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2957 -0
  115. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +77 -0
  116. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1389 -0
  117. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +26 -0
  118. package/dist/node_modules/node-gyp/gyp/pylib/gyp/input.py +3097 -0
  119. package/dist/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +99 -0
  120. package/dist/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +765 -0
  121. package/dist/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1255 -0
  122. package/dist/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
  123. package/dist/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
  124. package/dist/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +371 -0
  125. package/dist/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1936 -0
  126. package/dist/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +54 -0
  127. package/dist/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +301 -0
  128. package/dist/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3180 -0
  129. package/dist/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +64 -0
  130. package/dist/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +3 -0
  131. package/dist/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE +177 -0
  132. package/dist/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD +23 -0
  133. package/dist/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +15 -0
  134. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +107 -0
  135. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +252 -0
  136. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +83 -0
  137. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +359 -0
  138. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +61 -0
  139. package/dist/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +192 -0
  140. package/dist/node_modules/node-gyp/gyp/pylib/packaging/markers.py +251 -0
  141. package/dist/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +807 -0
  142. package/dist/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
  143. package/dist/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +90 -0
  144. package/dist/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +1030 -0
  145. package/dist/node_modules/node-gyp/gyp/pylib/packaging/tags.py +541 -0
  146. package/dist/node_modules/node-gyp/gyp/pylib/packaging/utils.py +172 -0
  147. package/dist/node_modules/node-gyp/gyp/pylib/packaging/version.py +563 -0
  148. package/dist/node_modules/node-gyp/gyp/pyproject.toml +116 -0
  149. package/dist/node_modules/node-gyp/gyp/release-please-config.json +11 -0
  150. package/dist/node_modules/node-gyp/gyp/test_gyp.py +260 -0
  151. package/dist/node_modules/node-gyp/lib/Find-VisualStudio.cs +250 -0
  152. package/dist/node_modules/node-gyp/lib/build.js +230 -0
  153. package/dist/node_modules/node-gyp/lib/clean.js +15 -0
  154. package/dist/node_modules/node-gyp/lib/configure.js +328 -0
  155. package/dist/node_modules/node-gyp/lib/create-config-gypi.js +153 -0
  156. package/dist/node_modules/node-gyp/lib/download.js +86 -0
  157. package/dist/node_modules/node-gyp/lib/find-node-directory.js +63 -0
  158. package/dist/node_modules/node-gyp/lib/find-python.js +304 -0
  159. package/dist/node_modules/node-gyp/lib/find-visualstudio.js +606 -0
  160. package/dist/node_modules/node-gyp/lib/install.js +411 -0
  161. package/dist/node_modules/node-gyp/lib/list.js +26 -0
  162. package/dist/node_modules/node-gyp/lib/log.js +168 -0
  163. package/dist/node_modules/node-gyp/lib/node-gyp.js +199 -0
  164. package/dist/node_modules/node-gyp/lib/process-release.js +144 -0
  165. package/dist/node_modules/node-gyp/lib/rebuild.js +12 -0
  166. package/dist/node_modules/node-gyp/lib/remove.js +43 -0
  167. package/dist/node_modules/node-gyp/lib/util.js +81 -0
  168. package/dist/node_modules/node-gyp/macOS_Catalina_acid_test.sh +21 -0
  169. package/dist/node_modules/node-gyp/package.json +52 -0
  170. package/dist/node_modules/node-gyp/release-please-config.json +40 -0
  171. package/dist/node_modules/node-gyp/src/win_delay_load_hook.cc +41 -0
  172. package/dist/node_modules/nopt/LICENSE +15 -0
  173. package/dist/node_modules/nopt/bin/nopt.js +29 -0
  174. package/dist/node_modules/nopt/lib/debug.js +5 -0
  175. package/dist/node_modules/nopt/lib/nopt-lib.js +514 -0
  176. package/dist/node_modules/nopt/lib/nopt.js +34 -0
  177. package/dist/node_modules/nopt/lib/type-defs.js +91 -0
  178. package/dist/node_modules/nopt/package.json +52 -0
  179. package/dist/node_modules/picomatch/LICENSE +21 -0
  180. package/dist/node_modules/picomatch/index.js +17 -0
  181. package/dist/node_modules/picomatch/lib/constants.js +184 -0
  182. package/dist/node_modules/picomatch/lib/parse.js +1416 -0
  183. package/dist/node_modules/picomatch/lib/picomatch.js +361 -0
  184. package/dist/node_modules/picomatch/lib/scan.js +391 -0
  185. package/dist/node_modules/picomatch/lib/utils.js +72 -0
  186. package/dist/node_modules/picomatch/package.json +83 -0
  187. package/dist/node_modules/picomatch/posix.js +3 -0
  188. package/dist/node_modules/proc-log/LICENSE +15 -0
  189. package/dist/node_modules/proc-log/lib/index.js +158 -0
  190. package/dist/node_modules/proc-log/package.json +46 -0
  191. package/dist/node_modules/semver/LICENSE +15 -0
  192. package/dist/node_modules/semver/bin/semver.js +195 -0
  193. package/dist/node_modules/semver/classes/comparator.js +143 -0
  194. package/dist/node_modules/semver/classes/index.js +7 -0
  195. package/dist/node_modules/semver/classes/range.js +577 -0
  196. package/dist/node_modules/semver/classes/semver.js +350 -0
  197. package/dist/node_modules/semver/functions/clean.js +8 -0
  198. package/dist/node_modules/semver/functions/cmp.js +54 -0
  199. package/dist/node_modules/semver/functions/coerce.js +62 -0
  200. package/dist/node_modules/semver/functions/compare-build.js +9 -0
  201. package/dist/node_modules/semver/functions/compare-loose.js +5 -0
  202. package/dist/node_modules/semver/functions/compare.js +7 -0
  203. package/dist/node_modules/semver/functions/diff.js +60 -0
  204. package/dist/node_modules/semver/functions/eq.js +5 -0
  205. package/dist/node_modules/semver/functions/gt.js +5 -0
  206. package/dist/node_modules/semver/functions/gte.js +5 -0
  207. package/dist/node_modules/semver/functions/inc.js +21 -0
  208. package/dist/node_modules/semver/functions/lt.js +5 -0
  209. package/dist/node_modules/semver/functions/lte.js +5 -0
  210. package/dist/node_modules/semver/functions/major.js +5 -0
  211. package/dist/node_modules/semver/functions/minor.js +5 -0
  212. package/dist/node_modules/semver/functions/neq.js +5 -0
  213. package/dist/node_modules/semver/functions/parse.js +18 -0
  214. package/dist/node_modules/semver/functions/patch.js +5 -0
  215. package/dist/node_modules/semver/functions/prerelease.js +8 -0
  216. package/dist/node_modules/semver/functions/rcompare.js +5 -0
  217. package/dist/node_modules/semver/functions/rsort.js +5 -0
  218. package/dist/node_modules/semver/functions/satisfies.js +12 -0
  219. package/dist/node_modules/semver/functions/sort.js +5 -0
  220. package/dist/node_modules/semver/functions/truncate.js +48 -0
  221. package/dist/node_modules/semver/functions/valid.js +8 -0
  222. package/dist/node_modules/semver/index.js +93 -0
  223. package/dist/node_modules/semver/internal/constants.js +37 -0
  224. package/dist/node_modules/semver/internal/debug.js +11 -0
  225. package/dist/node_modules/semver/internal/identifiers.js +29 -0
  226. package/dist/node_modules/semver/internal/lrucache.js +42 -0
  227. package/dist/node_modules/semver/internal/parse-options.js +17 -0
  228. package/dist/node_modules/semver/internal/re.js +223 -0
  229. package/dist/node_modules/semver/package.json +78 -0
  230. package/dist/node_modules/semver/preload.js +4 -0
  231. package/dist/node_modules/semver/range.bnf +17 -0
  232. package/dist/node_modules/semver/ranges/gtr.js +6 -0
  233. package/dist/node_modules/semver/ranges/intersects.js +9 -0
  234. package/dist/node_modules/semver/ranges/ltr.js +6 -0
  235. package/dist/node_modules/semver/ranges/max-satisfying.js +27 -0
  236. package/dist/node_modules/semver/ranges/min-satisfying.js +26 -0
  237. package/dist/node_modules/semver/ranges/min-version.js +63 -0
  238. package/dist/node_modules/semver/ranges/outside.js +82 -0
  239. package/dist/node_modules/semver/ranges/simplify.js +49 -0
  240. package/dist/node_modules/semver/ranges/subset.js +249 -0
  241. package/dist/node_modules/semver/ranges/to-comparators.js +10 -0
  242. package/dist/node_modules/semver/ranges/valid.js +13 -0
  243. package/dist/node_modules/tar/dist/commonjs/create.js +82 -0
  244. package/dist/node_modules/tar/dist/commonjs/cwd-error.js +18 -0
  245. package/dist/node_modules/tar/dist/commonjs/extract.js +88 -0
  246. package/dist/node_modules/tar/dist/commonjs/get-write-flag.js +32 -0
  247. package/dist/node_modules/tar/dist/commonjs/header.js +348 -0
  248. package/dist/node_modules/tar/dist/commonjs/index.js +64 -0
  249. package/dist/node_modules/tar/dist/commonjs/index.min.js +4 -0
  250. package/dist/node_modules/tar/dist/commonjs/large-numbers.js +99 -0
  251. package/dist/node_modules/tar/dist/commonjs/list.js +153 -0
  252. package/dist/node_modules/tar/dist/commonjs/make-command.js +52 -0
  253. package/dist/node_modules/tar/dist/commonjs/mkdir.js +187 -0
  254. package/dist/node_modules/tar/dist/commonjs/mode-fix.js +29 -0
  255. package/dist/node_modules/tar/dist/commonjs/normalize-unicode.js +38 -0
  256. package/dist/node_modules/tar/dist/commonjs/normalize-windows-path.js +12 -0
  257. package/dist/node_modules/tar/dist/commonjs/options.js +66 -0
  258. package/dist/node_modules/tar/dist/commonjs/pack.js +544 -0
  259. package/dist/node_modules/tar/dist/commonjs/package.json +3 -0
  260. package/dist/node_modules/tar/dist/commonjs/parse.js +655 -0
  261. package/dist/node_modules/tar/dist/commonjs/path-reservations.js +170 -0
  262. package/dist/node_modules/tar/dist/commonjs/pax.js +182 -0
  263. package/dist/node_modules/tar/dist/commonjs/process-umask.js +7 -0
  264. package/dist/node_modules/tar/dist/commonjs/read-entry.js +136 -0
  265. package/dist/node_modules/tar/dist/commonjs/replace.js +227 -0
  266. package/dist/node_modules/tar/dist/commonjs/strip-absolute-path.js +29 -0
  267. package/dist/node_modules/tar/dist/commonjs/strip-trailing-slashes.js +18 -0
  268. package/dist/node_modules/tar/dist/commonjs/symlink-error.js +19 -0
  269. package/dist/node_modules/tar/dist/commonjs/types.js +70 -0
  270. package/dist/node_modules/tar/dist/commonjs/unpack.js +932 -0
  271. package/dist/node_modules/tar/dist/commonjs/update.js +33 -0
  272. package/dist/node_modules/tar/dist/commonjs/warn-method.js +31 -0
  273. package/dist/node_modules/tar/dist/commonjs/winchars.js +14 -0
  274. package/dist/node_modules/tar/dist/commonjs/write-entry.js +698 -0
  275. package/dist/node_modules/tar/dist/esm/create.js +76 -0
  276. package/dist/node_modules/tar/dist/esm/cwd-error.js +14 -0
  277. package/dist/node_modules/tar/dist/esm/extract.js +49 -0
  278. package/dist/node_modules/tar/dist/esm/get-write-flag.js +26 -0
  279. package/dist/node_modules/tar/dist/esm/header.js +311 -0
  280. package/dist/node_modules/tar/dist/esm/index.js +20 -0
  281. package/dist/node_modules/tar/dist/esm/index.min.js +4 -0
  282. package/dist/node_modules/tar/dist/esm/large-numbers.js +94 -0
  283. package/dist/node_modules/tar/dist/esm/list.js +113 -0
  284. package/dist/node_modules/tar/dist/esm/make-command.js +48 -0
  285. package/dist/node_modules/tar/dist/esm/mkdir.js +179 -0
  286. package/dist/node_modules/tar/dist/esm/mode-fix.js +25 -0
  287. package/dist/node_modules/tar/dist/esm/normalize-unicode.js +34 -0
  288. package/dist/node_modules/tar/dist/esm/normalize-windows-path.js +9 -0
  289. package/dist/node_modules/tar/dist/esm/options.js +54 -0
  290. package/dist/node_modules/tar/dist/esm/pack.js +502 -0
  291. package/dist/node_modules/tar/dist/esm/package.json +3 -0
  292. package/dist/node_modules/tar/dist/esm/parse.js +651 -0
  293. package/dist/node_modules/tar/dist/esm/path-reservations.js +166 -0
  294. package/dist/node_modules/tar/dist/esm/pax.js +178 -0
  295. package/dist/node_modules/tar/dist/esm/process-umask.js +3 -0
  296. package/dist/node_modules/tar/dist/esm/read-entry.js +132 -0
  297. package/dist/node_modules/tar/dist/esm/replace.js +221 -0
  298. package/dist/node_modules/tar/dist/esm/strip-absolute-path.js +25 -0
  299. package/dist/node_modules/tar/dist/esm/strip-trailing-slashes.js +14 -0
  300. package/dist/node_modules/tar/dist/esm/symlink-error.js +15 -0
  301. package/dist/node_modules/tar/dist/esm/types.js +65 -0
  302. package/dist/node_modules/tar/dist/esm/unpack.js +891 -0
  303. package/dist/node_modules/tar/dist/esm/update.js +30 -0
  304. package/dist/node_modules/tar/dist/esm/warn-method.js +27 -0
  305. package/dist/node_modules/tar/dist/esm/winchars.js +9 -0
  306. package/dist/node_modules/tar/dist/esm/write-entry.js +656 -0
  307. package/dist/node_modules/tar/package.json +298 -0
  308. package/{LICENSE → dist/node_modules/tinyglobby/LICENSE} +2 -3
  309. package/dist/node_modules/tinyglobby/dist/index.cjs +335 -0
  310. package/dist/node_modules/tinyglobby/dist/index.d.cts +148 -0
  311. package/dist/node_modules/tinyglobby/dist/index.d.mts +148 -0
  312. package/dist/node_modules/tinyglobby/dist/index.mjs +307 -0
  313. package/dist/node_modules/tinyglobby/package.json +70 -0
  314. package/dist/node_modules/undici/LICENSE +21 -0
  315. package/dist/node_modules/undici/index-fetch.js +35 -0
  316. package/dist/node_modules/undici/index.js +169 -0
  317. package/dist/node_modules/undici/lib/api/abort-signal.js +57 -0
  318. package/dist/node_modules/undici/lib/api/api-connect.js +108 -0
  319. package/dist/node_modules/undici/lib/api/api-pipeline.js +251 -0
  320. package/dist/node_modules/undici/lib/api/api-request.js +214 -0
  321. package/dist/node_modules/undici/lib/api/api-stream.js +220 -0
  322. package/dist/node_modules/undici/lib/api/api-upgrade.js +108 -0
  323. package/dist/node_modules/undici/lib/api/index.js +7 -0
  324. package/dist/node_modules/undici/lib/api/readable.js +385 -0
  325. package/dist/node_modules/undici/lib/api/util.js +93 -0
  326. package/dist/node_modules/undici/lib/core/connect.js +240 -0
  327. package/dist/node_modules/undici/lib/core/constants.js +118 -0
  328. package/dist/node_modules/undici/lib/core/diagnostics.js +202 -0
  329. package/dist/node_modules/undici/lib/core/errors.js +425 -0
  330. package/dist/node_modules/undici/lib/core/request.js +416 -0
  331. package/dist/node_modules/undici/lib/core/symbols.js +67 -0
  332. package/dist/node_modules/undici/lib/core/tree.js +152 -0
  333. package/dist/node_modules/undici/lib/core/util.js +719 -0
  334. package/dist/node_modules/undici/lib/dispatcher/agent.js +129 -0
  335. package/dist/node_modules/undici/lib/dispatcher/balanced-pool.js +209 -0
  336. package/dist/node_modules/undici/lib/dispatcher/client-h1.js +1496 -0
  337. package/dist/node_modules/undici/lib/dispatcher/client-h2.js +744 -0
  338. package/dist/node_modules/undici/lib/dispatcher/client.js +623 -0
  339. package/dist/node_modules/undici/lib/dispatcher/dispatcher-base.js +199 -0
  340. package/dist/node_modules/undici/lib/dispatcher/dispatcher.js +65 -0
  341. package/dist/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +160 -0
  342. package/dist/node_modules/undici/lib/dispatcher/fixed-queue.js +117 -0
  343. package/dist/node_modules/undici/lib/dispatcher/pool-base.js +194 -0
  344. package/dist/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
  345. package/dist/node_modules/undici/lib/dispatcher/pool.js +107 -0
  346. package/dist/node_modules/undici/lib/dispatcher/proxy-agent.js +274 -0
  347. package/dist/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  348. package/dist/node_modules/undici/lib/global.js +32 -0
  349. package/dist/node_modules/undici/lib/handler/decorator-handler.js +44 -0
  350. package/dist/node_modules/undici/lib/handler/redirect-handler.js +232 -0
  351. package/dist/node_modules/undici/lib/handler/retry-handler.js +408 -0
  352. package/dist/node_modules/undici/lib/interceptor/dns.js +375 -0
  353. package/dist/node_modules/undici/lib/interceptor/dump.js +123 -0
  354. package/dist/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
  355. package/dist/node_modules/undici/lib/interceptor/redirect.js +24 -0
  356. package/dist/node_modules/undici/lib/interceptor/response-error.js +86 -0
  357. package/dist/node_modules/undici/lib/interceptor/retry.js +19 -0
  358. package/dist/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  359. package/dist/node_modules/undici/lib/llhttp/constants.js +278 -0
  360. package/dist/node_modules/undici/lib/llhttp/llhttp-wasm.js +5 -0
  361. package/dist/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +5 -0
  362. package/dist/node_modules/undici/lib/llhttp/utils.js +15 -0
  363. package/dist/node_modules/undici/lib/mock/mock-agent.js +160 -0
  364. package/dist/node_modules/undici/lib/mock/mock-client.js +59 -0
  365. package/dist/node_modules/undici/lib/mock/mock-errors.js +28 -0
  366. package/dist/node_modules/undici/lib/mock/mock-interceptor.js +207 -0
  367. package/dist/node_modules/undici/lib/mock/mock-pool.js +59 -0
  368. package/dist/node_modules/undici/lib/mock/mock-symbols.js +23 -0
  369. package/dist/node_modules/undici/lib/mock/mock-utils.js +367 -0
  370. package/dist/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  371. package/dist/node_modules/undici/lib/mock/pluralizer.js +29 -0
  372. package/dist/node_modules/undici/lib/util/timers.js +423 -0
  373. package/dist/node_modules/undici/lib/web/cache/cache.js +859 -0
  374. package/dist/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  375. package/dist/node_modules/undici/lib/web/cache/symbols.js +5 -0
  376. package/dist/node_modules/undici/lib/web/cache/util.js +45 -0
  377. package/dist/node_modules/undici/lib/web/cookies/constants.js +12 -0
  378. package/dist/node_modules/undici/lib/web/cookies/index.js +184 -0
  379. package/dist/node_modules/undici/lib/web/cookies/parse.js +310 -0
  380. package/dist/node_modules/undici/lib/web/cookies/util.js +352 -0
  381. package/dist/node_modules/undici/lib/web/eventsource/eventsource-stream.js +398 -0
  382. package/dist/node_modules/undici/lib/web/eventsource/eventsource.js +480 -0
  383. package/dist/node_modules/undici/lib/web/eventsource/util.js +37 -0
  384. package/dist/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  385. package/dist/node_modules/undici/lib/web/fetch/body.js +529 -0
  386. package/dist/node_modules/undici/lib/web/fetch/constants.js +124 -0
  387. package/dist/node_modules/undici/lib/web/fetch/data-url.js +744 -0
  388. package/dist/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
  389. package/dist/node_modules/undici/lib/web/fetch/file.js +126 -0
  390. package/dist/node_modules/undici/lib/web/fetch/formdata-parser.js +474 -0
  391. package/dist/node_modules/undici/lib/web/fetch/formdata.js +252 -0
  392. package/dist/node_modules/undici/lib/web/fetch/global.js +40 -0
  393. package/dist/node_modules/undici/lib/web/fetch/headers.js +687 -0
  394. package/dist/node_modules/undici/lib/web/fetch/index.js +2272 -0
  395. package/dist/node_modules/undici/lib/web/fetch/request.js +1037 -0
  396. package/dist/node_modules/undici/lib/web/fetch/response.js +610 -0
  397. package/dist/node_modules/undici/lib/web/fetch/symbols.js +9 -0
  398. package/dist/node_modules/undici/lib/web/fetch/util.js +1632 -0
  399. package/dist/node_modules/undici/lib/web/fetch/webidl.js +695 -0
  400. package/dist/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
  401. package/dist/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
  402. package/dist/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
  403. package/dist/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
  404. package/dist/node_modules/undici/lib/web/fileapi/util.js +391 -0
  405. package/dist/node_modules/undici/lib/web/websocket/connection.js +371 -0
  406. package/dist/node_modules/undici/lib/web/websocket/constants.js +66 -0
  407. package/dist/node_modules/undici/lib/web/websocket/events.js +329 -0
  408. package/dist/node_modules/undici/lib/web/websocket/frame.js +96 -0
  409. package/dist/node_modules/undici/lib/web/websocket/permessage-deflate.js +100 -0
  410. package/dist/node_modules/undici/lib/web/websocket/receiver.js +513 -0
  411. package/dist/node_modules/undici/lib/web/websocket/sender.js +104 -0
  412. package/dist/node_modules/undici/lib/web/websocket/symbols.js +12 -0
  413. package/dist/node_modules/undici/lib/web/websocket/util.js +322 -0
  414. package/dist/node_modules/undici/lib/web/websocket/websocket.js +595 -0
  415. package/dist/node_modules/undici/package.json +160 -0
  416. package/dist/node_modules/undici/scripts/strip-comments.js +8 -0
  417. package/dist/node_modules/which/LICENSE +15 -0
  418. package/dist/node_modules/which/bin/which.js +52 -0
  419. package/dist/node_modules/which/lib/index.js +111 -0
  420. package/dist/node_modules/which/package.json +52 -0
  421. package/dist/node_modules/yallist/dist/commonjs/index.js +384 -0
  422. package/dist/node_modules/yallist/dist/commonjs/package.json +3 -0
  423. package/dist/node_modules/yallist/dist/esm/index.js +379 -0
  424. package/dist/node_modules/yallist/dist/esm/package.json +3 -0
  425. package/dist/node_modules/yallist/package.json +68 -0
  426. package/package.json +22 -11
@@ -0,0 +1,1496 @@
1
+ 'use strict'
2
+
3
+ /* global WebAssembly */
4
+
5
+ const assert = require('node:assert')
6
+ const util = require('../core/util.js')
7
+ const { channels } = require('../core/diagnostics.js')
8
+ const timers = require('../util/timers.js')
9
+ const {
10
+ RequestContentLengthMismatchError,
11
+ ResponseContentLengthMismatchError,
12
+ RequestAbortedError,
13
+ InvalidArgumentError,
14
+ HeadersTimeoutError,
15
+ HeadersOverflowError,
16
+ SocketError,
17
+ InformationalError,
18
+ BodyTimeoutError,
19
+ HTTPParserError,
20
+ ResponseExceededMaxSizeError
21
+ } = require('../core/errors.js')
22
+ const {
23
+ kUrl,
24
+ kReset,
25
+ kClient,
26
+ kParser,
27
+ kBlocking,
28
+ kRunning,
29
+ kPending,
30
+ kSize,
31
+ kWriting,
32
+ kQueue,
33
+ kNoRef,
34
+ kKeepAliveDefaultTimeout,
35
+ kHostHeader,
36
+ kPendingIdx,
37
+ kRunningIdx,
38
+ kError,
39
+ kPipelining,
40
+ kSocket,
41
+ kKeepAliveTimeoutValue,
42
+ kMaxHeadersSize,
43
+ kKeepAliveMaxTimeout,
44
+ kKeepAliveTimeoutThreshold,
45
+ kHeadersTimeout,
46
+ kBodyTimeout,
47
+ kStrictContentLength,
48
+ kMaxRequests,
49
+ kCounter,
50
+ kMaxResponseSize,
51
+ kOnError,
52
+ kResume,
53
+ kHTTPContext
54
+ } = require('../core/symbols.js')
55
+
56
+ const constants = require('../llhttp/constants.js')
57
+ const EMPTY_BUF = Buffer.alloc(0)
58
+ const FastBuffer = Buffer[Symbol.species]
59
+ const addListener = util.addListener
60
+ const removeAllListeners = util.removeAllListeners
61
+ const kIdleSocketValidation = Symbol('kIdleSocketValidation')
62
+ const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout')
63
+ const kSocketUsed = Symbol('kSocketUsed')
64
+
65
+ let extractBody
66
+
67
+ async function lazyllhttp () {
68
+ const llhttpWasmData = process.env.JEST_WORKER_ID ? require('../llhttp/llhttp-wasm.js') : undefined
69
+
70
+ let mod
71
+ try {
72
+ mod = await WebAssembly.compile(require('../llhttp/llhttp_simd-wasm.js'))
73
+ } catch (e) {
74
+ /* istanbul ignore next */
75
+
76
+ // We could check if the error was caused by the simd option not
77
+ // being enabled, but the occurring of this other error
78
+ // * https://github.com/emscripten-core/emscripten/issues/11495
79
+ // got me to remove that check to avoid breaking Node 12.
80
+ mod = await WebAssembly.compile(llhttpWasmData || require('../llhttp/llhttp-wasm.js'))
81
+ }
82
+
83
+ return await WebAssembly.instantiate(mod, {
84
+ env: {
85
+ /* eslint-disable camelcase */
86
+
87
+ wasm_on_url: (p, at, len) => {
88
+ /* istanbul ignore next */
89
+ return 0
90
+ },
91
+ wasm_on_status: (p, at, len) => {
92
+ assert(currentParser.ptr === p)
93
+ const start = at - currentBufferPtr + currentBufferRef.byteOffset
94
+ return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
95
+ },
96
+ wasm_on_message_begin: (p) => {
97
+ assert(currentParser.ptr === p)
98
+ return currentParser.onMessageBegin() || 0
99
+ },
100
+ wasm_on_header_field: (p, at, len) => {
101
+ assert(currentParser.ptr === p)
102
+ const start = at - currentBufferPtr + currentBufferRef.byteOffset
103
+ return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
104
+ },
105
+ wasm_on_header_value: (p, at, len) => {
106
+ assert(currentParser.ptr === p)
107
+ const start = at - currentBufferPtr + currentBufferRef.byteOffset
108
+ return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
109
+ },
110
+ wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {
111
+ assert(currentParser.ptr === p)
112
+ return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0
113
+ },
114
+ wasm_on_body: (p, at, len) => {
115
+ assert(currentParser.ptr === p)
116
+ const start = at - currentBufferPtr + currentBufferRef.byteOffset
117
+ return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0
118
+ },
119
+ wasm_on_message_complete: (p) => {
120
+ assert(currentParser.ptr === p)
121
+ return currentParser.onMessageComplete() || 0
122
+ }
123
+
124
+ /* eslint-enable camelcase */
125
+ }
126
+ })
127
+ }
128
+
129
+ let llhttpInstance = null
130
+ let llhttpPromise = lazyllhttp()
131
+ llhttpPromise.catch()
132
+
133
+ let currentParser = null
134
+ let currentBufferRef = null
135
+ let currentBufferSize = 0
136
+ let currentBufferPtr = null
137
+
138
+ const USE_NATIVE_TIMER = 0
139
+ const USE_FAST_TIMER = 1
140
+
141
+ // Use fast timers for headers and body to take eventual event loop
142
+ // latency into account.
143
+ const TIMEOUT_HEADERS = 2 | USE_FAST_TIMER
144
+ const TIMEOUT_BODY = 4 | USE_FAST_TIMER
145
+
146
+ // Use native timers to ignore event loop latency for keep-alive
147
+ // handling.
148
+ const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER
149
+
150
+ class Parser {
151
+ constructor (client, socket, { exports }) {
152
+ assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0)
153
+
154
+ this.llhttp = exports
155
+ this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)
156
+ this.client = client
157
+ this.socket = socket
158
+ this.timeout = null
159
+ this.timeoutValue = null
160
+ this.timeoutType = null
161
+ this.statusCode = null
162
+ this.statusText = ''
163
+ this.upgrade = false
164
+ this.headers = []
165
+ this.headersSize = 0
166
+ this.headersMaxSize = client[kMaxHeadersSize]
167
+ this.shouldKeepAlive = false
168
+ this.paused = false
169
+ this.resume = this.resume.bind(this)
170
+
171
+ this.bytesRead = 0
172
+
173
+ this.keepAlive = ''
174
+ this.contentLength = ''
175
+ this.connection = ''
176
+ this.maxResponseSize = client[kMaxResponseSize]
177
+ }
178
+
179
+ setTimeout (delay, type) {
180
+ // If the existing timer and the new timer are of different timer type
181
+ // (fast or native) or have different delay, we need to clear the existing
182
+ // timer and set a new one.
183
+ if (
184
+ delay !== this.timeoutValue ||
185
+ (type & USE_FAST_TIMER) ^ (this.timeoutType & USE_FAST_TIMER)
186
+ ) {
187
+ // If a timeout is already set, clear it with clearTimeout of the fast
188
+ // timer implementation, as it can clear fast and native timers.
189
+ if (this.timeout) {
190
+ timers.clearTimeout(this.timeout)
191
+ this.timeout = null
192
+ }
193
+
194
+ if (delay) {
195
+ if (type & USE_FAST_TIMER) {
196
+ this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this))
197
+ } else {
198
+ this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this))
199
+ this.timeout.unref()
200
+ }
201
+ }
202
+
203
+ this.timeoutValue = delay
204
+ } else if (this.timeout) {
205
+ // istanbul ignore else: only for jest
206
+ if (this.timeout.refresh) {
207
+ this.timeout.refresh()
208
+ }
209
+ }
210
+
211
+ this.timeoutType = type
212
+ }
213
+
214
+ resume () {
215
+ if (this.socket.destroyed || !this.paused) {
216
+ return
217
+ }
218
+
219
+ assert(this.ptr != null)
220
+ assert(currentParser == null)
221
+
222
+ this.llhttp.llhttp_resume(this.ptr)
223
+
224
+ assert(this.timeoutType === TIMEOUT_BODY)
225
+ if (this.timeout) {
226
+ // istanbul ignore else: only for jest
227
+ if (this.timeout.refresh) {
228
+ this.timeout.refresh()
229
+ }
230
+ }
231
+
232
+ this.paused = false
233
+ this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.
234
+ this.readMore()
235
+ }
236
+
237
+ readMore () {
238
+ while (!this.paused && this.ptr) {
239
+ const chunk = this.socket.read()
240
+ if (chunk === null) {
241
+ break
242
+ }
243
+ this.execute(chunk)
244
+ }
245
+ }
246
+
247
+ execute (data) {
248
+ assert(this.ptr != null)
249
+ assert(currentParser == null)
250
+ assert(!this.paused)
251
+
252
+ const { socket, llhttp } = this
253
+
254
+ if (data.length > currentBufferSize) {
255
+ if (currentBufferPtr) {
256
+ llhttp.free(currentBufferPtr)
257
+ }
258
+ currentBufferSize = Math.ceil(data.length / 4096) * 4096
259
+ currentBufferPtr = llhttp.malloc(currentBufferSize)
260
+ }
261
+
262
+ new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data)
263
+
264
+ // Call `execute` on the wasm parser.
265
+ // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,
266
+ // and finally the length of bytes to parse.
267
+ // The return value is an error code or `constants.ERROR.OK`.
268
+ try {
269
+ let ret
270
+
271
+ try {
272
+ currentBufferRef = data
273
+ currentParser = this
274
+ ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length)
275
+ /* eslint-disable-next-line no-useless-catch */
276
+ } catch (err) {
277
+ /* istanbul ignore next: difficult to make a test case for */
278
+ throw err
279
+ } finally {
280
+ currentParser = null
281
+ currentBufferRef = null
282
+ }
283
+
284
+ const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr
285
+
286
+ if (ret !== constants.ERROR.OK) {
287
+ const body = data.subarray(offset)
288
+
289
+ if (ret === constants.ERROR.PAUSED_UPGRADE) {
290
+ this.onUpgrade(body)
291
+ } else if (ret === constants.ERROR.PAUSED) {
292
+ this.paused = true
293
+ socket.unshift(body)
294
+ } else {
295
+ throw this.createError(ret, body)
296
+ }
297
+ }
298
+ } catch (err) {
299
+ util.destroy(socket, err)
300
+ }
301
+ }
302
+
303
+ finish () {
304
+ assert(currentParser === null)
305
+ assert(this.ptr != null)
306
+ assert(!this.paused)
307
+
308
+ const { llhttp } = this
309
+
310
+ let ret
311
+
312
+ try {
313
+ currentParser = this
314
+ ret = llhttp.llhttp_finish(this.ptr)
315
+ } finally {
316
+ currentParser = null
317
+ }
318
+
319
+ if (ret === constants.ERROR.OK) {
320
+ return null
321
+ }
322
+
323
+ if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) {
324
+ this.paused = true
325
+ return null
326
+ }
327
+
328
+ return this.createError(ret, EMPTY_BUF)
329
+ }
330
+
331
+ createError (ret, data) {
332
+ const { llhttp, contentLength, bytesRead } = this
333
+
334
+ if (contentLength && bytesRead !== parseInt(contentLength, 10)) {
335
+ return new ResponseContentLengthMismatchError()
336
+ }
337
+
338
+ const ptr = llhttp.llhttp_get_error_reason(this.ptr)
339
+ let message = ''
340
+ if (ptr) {
341
+ const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)
342
+ message =
343
+ 'Response does not match the HTTP/1.1 protocol (' +
344
+ Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
345
+ ')'
346
+ }
347
+
348
+ return new HTTPParserError(message, constants.ERROR[ret], data)
349
+ }
350
+
351
+ destroy () {
352
+ assert(this.ptr != null)
353
+ assert(currentParser == null)
354
+
355
+ this.llhttp.llhttp_free(this.ptr)
356
+ this.ptr = null
357
+
358
+ this.timeout && timers.clearTimeout(this.timeout)
359
+ this.timeout = null
360
+ this.timeoutValue = null
361
+ this.timeoutType = null
362
+
363
+ this.paused = false
364
+ }
365
+
366
+ onStatus (buf) {
367
+ this.statusText = buf.toString()
368
+ }
369
+
370
+ onMessageBegin () {
371
+ const { socket, client } = this
372
+
373
+ /* istanbul ignore next: difficult to make a test case for */
374
+ if (socket.destroyed) {
375
+ return -1
376
+ }
377
+
378
+ if (client[kRunning] === 0) {
379
+ util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))
380
+ return -1
381
+ }
382
+
383
+ const request = client[kQueue][client[kRunningIdx]]
384
+ if (!request) {
385
+ return -1
386
+ }
387
+ request.onResponseStarted()
388
+ }
389
+
390
+ onHeaderField (buf) {
391
+ const len = this.headers.length
392
+
393
+ if ((len & 1) === 0) {
394
+ this.headers.push(buf)
395
+ } else {
396
+ this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])
397
+ }
398
+
399
+ this.trackHeader(buf.length)
400
+ }
401
+
402
+ onHeaderValue (buf) {
403
+ let len = this.headers.length
404
+
405
+ if ((len & 1) === 1) {
406
+ this.headers.push(buf)
407
+ len += 1
408
+ } else {
409
+ this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])
410
+ }
411
+
412
+ const key = this.headers[len - 2]
413
+ if (key.length === 10) {
414
+ const headerName = util.bufferToLowerCasedHeaderName(key)
415
+ if (headerName === 'keep-alive') {
416
+ this.keepAlive += buf.toString()
417
+ } else if (headerName === 'connection') {
418
+ this.connection += buf.toString()
419
+ }
420
+ } else if (key.length === 14 && util.bufferToLowerCasedHeaderName(key) === 'content-length') {
421
+ this.contentLength += buf.toString()
422
+ }
423
+
424
+ this.trackHeader(buf.length)
425
+ }
426
+
427
+ trackHeader (len) {
428
+ this.headersSize += len
429
+ if (this.headersSize >= this.headersMaxSize) {
430
+ util.destroy(this.socket, new HeadersOverflowError())
431
+ }
432
+ }
433
+
434
+ onUpgrade (head) {
435
+ const { upgrade, client, socket, headers, statusCode } = this
436
+
437
+ assert(upgrade)
438
+ assert(client[kSocket] === socket)
439
+ assert(!socket.destroyed)
440
+ assert(!this.paused)
441
+ assert((headers.length & 1) === 0)
442
+
443
+ const request = client[kQueue][client[kRunningIdx]]
444
+ assert(request)
445
+ assert(request.upgrade || request.method === 'CONNECT')
446
+
447
+ this.statusCode = null
448
+ this.statusText = ''
449
+ this.shouldKeepAlive = null
450
+
451
+ this.headers = []
452
+ this.headersSize = 0
453
+
454
+ socket.unshift(head)
455
+
456
+ socket[kParser].destroy()
457
+ socket[kParser] = null
458
+
459
+ socket[kClient] = null
460
+ socket[kError] = null
461
+
462
+ removeAllListeners(socket)
463
+
464
+ client[kSocket] = null
465
+ client[kHTTPContext] = null // TODO (fix): This is hacky...
466
+ client[kQueue][client[kRunningIdx]++] = null
467
+ client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))
468
+
469
+ try {
470
+ request.onUpgrade(statusCode, headers, socket)
471
+ } catch (err) {
472
+ util.destroy(socket, err)
473
+ }
474
+
475
+ client[kResume]()
476
+ }
477
+
478
+ onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {
479
+ const { client, socket, headers, statusText } = this
480
+
481
+ /* istanbul ignore next: difficult to make a test case for */
482
+ if (socket.destroyed) {
483
+ return -1
484
+ }
485
+
486
+ if (client[kRunning] === 0) {
487
+ util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))
488
+ return -1
489
+ }
490
+
491
+ const request = client[kQueue][client[kRunningIdx]]
492
+
493
+ /* istanbul ignore next: difficult to make a test case for */
494
+ if (!request) {
495
+ return -1
496
+ }
497
+
498
+ assert(!this.upgrade)
499
+ assert(this.statusCode < 200)
500
+
501
+ if (statusCode === 100) {
502
+ util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))
503
+ return -1
504
+ }
505
+
506
+ /* this can only happen if server is misbehaving */
507
+ if (upgrade && !request.upgrade) {
508
+ util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))
509
+ return -1
510
+ }
511
+
512
+ assert(this.timeoutType === TIMEOUT_HEADERS)
513
+
514
+ this.statusCode = statusCode
515
+ this.shouldKeepAlive = (
516
+ shouldKeepAlive ||
517
+ // Override llhttp value which does not allow keepAlive for HEAD.
518
+ (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')
519
+ )
520
+
521
+ if (this.statusCode >= 200) {
522
+ const bodyTimeout = request.bodyTimeout != null
523
+ ? request.bodyTimeout
524
+ : client[kBodyTimeout]
525
+ this.setTimeout(bodyTimeout, TIMEOUT_BODY)
526
+ } else if (this.timeout) {
527
+ // istanbul ignore else: only for jest
528
+ if (this.timeout.refresh) {
529
+ this.timeout.refresh()
530
+ }
531
+ }
532
+
533
+ if (request.method === 'CONNECT') {
534
+ assert(client[kRunning] === 1)
535
+ this.upgrade = true
536
+ return 2
537
+ }
538
+
539
+ if (upgrade) {
540
+ assert(client[kRunning] === 1)
541
+ this.upgrade = true
542
+ return 2
543
+ }
544
+
545
+ assert((this.headers.length & 1) === 0)
546
+ this.headers = []
547
+ this.headersSize = 0
548
+
549
+ if (this.shouldKeepAlive && client[kPipelining]) {
550
+ const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null
551
+
552
+ if (keepAliveTimeout != null) {
553
+ const timeout = Math.min(
554
+ keepAliveTimeout - client[kKeepAliveTimeoutThreshold],
555
+ client[kKeepAliveMaxTimeout]
556
+ )
557
+ if (timeout <= 0) {
558
+ socket[kReset] = true
559
+ } else {
560
+ client[kKeepAliveTimeoutValue] = timeout
561
+ }
562
+ } else {
563
+ client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]
564
+ }
565
+ } else {
566
+ // Stop more requests from being dispatched.
567
+ socket[kReset] = true
568
+ }
569
+
570
+ const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false
571
+
572
+ if (request.aborted) {
573
+ return -1
574
+ }
575
+
576
+ if (request.method === 'HEAD') {
577
+ return 1
578
+ }
579
+
580
+ if (statusCode < 200) {
581
+ return 1
582
+ }
583
+
584
+ if (socket[kBlocking]) {
585
+ socket[kBlocking] = false
586
+ client[kResume]()
587
+ }
588
+
589
+ return pause ? constants.ERROR.PAUSED : 0
590
+ }
591
+
592
+ onBody (buf) {
593
+ const { client, socket, statusCode, maxResponseSize } = this
594
+
595
+ if (socket.destroyed) {
596
+ return -1
597
+ }
598
+
599
+ const request = client[kQueue][client[kRunningIdx]]
600
+ assert(request)
601
+
602
+ assert(this.timeoutType === TIMEOUT_BODY)
603
+ if (this.timeout) {
604
+ // istanbul ignore else: only for jest
605
+ if (this.timeout.refresh) {
606
+ this.timeout.refresh()
607
+ }
608
+ }
609
+
610
+ assert(statusCode >= 200)
611
+
612
+ if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {
613
+ util.destroy(socket, new ResponseExceededMaxSizeError())
614
+ return -1
615
+ }
616
+
617
+ this.bytesRead += buf.length
618
+
619
+ if (request.onData(buf) === false) {
620
+ return constants.ERROR.PAUSED
621
+ }
622
+ }
623
+
624
+ onMessageComplete () {
625
+ const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this
626
+
627
+ if (socket.destroyed && (!statusCode || shouldKeepAlive)) {
628
+ return -1
629
+ }
630
+
631
+ if (upgrade) {
632
+ return
633
+ }
634
+
635
+ assert(statusCode >= 100)
636
+ assert((this.headers.length & 1) === 0)
637
+
638
+ const request = client[kQueue][client[kRunningIdx]]
639
+ assert(request)
640
+
641
+ this.statusCode = null
642
+ this.statusText = ''
643
+ this.bytesRead = 0
644
+ this.contentLength = ''
645
+ this.keepAlive = ''
646
+ this.connection = ''
647
+
648
+ this.headers = []
649
+ this.headersSize = 0
650
+
651
+ if (statusCode < 200) {
652
+ return
653
+ }
654
+
655
+ /* istanbul ignore next: should be handled by llhttp? */
656
+ if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {
657
+ util.destroy(socket, new ResponseContentLengthMismatchError())
658
+ return -1
659
+ }
660
+
661
+ request.onComplete(headers)
662
+
663
+ client[kQueue][client[kRunningIdx]++] = null
664
+ socket[kSocketUsed] = true
665
+
666
+ if (socket[kWriting]) {
667
+ assert(client[kRunning] === 0)
668
+ // Response completed before request.
669
+ util.destroy(socket, new InformationalError('reset'))
670
+ return constants.ERROR.PAUSED
671
+ } else if (!shouldKeepAlive) {
672
+ util.destroy(socket, new InformationalError('reset'))
673
+ return constants.ERROR.PAUSED
674
+ } else if (socket[kReset] && client[kRunning] === 0) {
675
+ // Destroy socket once all requests have completed.
676
+ // The request at the tail of the pipeline is the one
677
+ // that requested reset and no further requests should
678
+ // have been queued since then.
679
+ util.destroy(socket, new InformationalError('reset'))
680
+ return constants.ERROR.PAUSED
681
+ } else if (client[kPipelining] == null || client[kPipelining] === 1) {
682
+ // We must wait a full event loop cycle to reuse this socket to make sure
683
+ // that non-spec compliant servers are not closing the connection even if they
684
+ // said they won't.
685
+ setImmediate(() => client[kResume]())
686
+ } else {
687
+ client[kResume]()
688
+ }
689
+ }
690
+ }
691
+
692
+ function onParserTimeout (parser) {
693
+ const { socket, timeoutType, client, paused } = parser.deref()
694
+
695
+ /* istanbul ignore else */
696
+ if (timeoutType === TIMEOUT_HEADERS) {
697
+ if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {
698
+ assert(!paused, 'cannot be paused while waiting for headers')
699
+ util.destroy(socket, new HeadersTimeoutError())
700
+ }
701
+ } else if (timeoutType === TIMEOUT_BODY) {
702
+ if (!paused) {
703
+ util.destroy(socket, new BodyTimeoutError())
704
+ }
705
+ } else if (timeoutType === TIMEOUT_KEEP_ALIVE) {
706
+ assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])
707
+ util.destroy(socket, new InformationalError('socket idle timeout'))
708
+ }
709
+ }
710
+
711
+ async function connectH1 (client, socket) {
712
+ client[kSocket] = socket
713
+
714
+ if (!llhttpInstance) {
715
+ llhttpInstance = await llhttpPromise
716
+ llhttpPromise = null
717
+ }
718
+
719
+ socket[kNoRef] = false
720
+ socket[kWriting] = false
721
+ socket[kReset] = false
722
+ socket[kBlocking] = false
723
+ socket[kIdleSocketValidation] = 0
724
+ socket[kIdleSocketValidationTimeout] = null
725
+ socket[kSocketUsed] = false
726
+ socket[kParser] = new Parser(client, socket, llhttpInstance)
727
+
728
+ addListener(socket, 'error', function (err) {
729
+ assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')
730
+
731
+ const parser = this[kParser]
732
+
733
+ // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
734
+ // to the user.
735
+ if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
736
+ const parserErr = parser.finish()
737
+ if (parserErr) {
738
+ this[kError] = parserErr
739
+ this[kClient][kOnError](parserErr)
740
+ }
741
+ return
742
+ }
743
+
744
+ this[kError] = err
745
+
746
+ this[kClient][kOnError](err)
747
+ })
748
+ addListener(socket, 'readable', function () {
749
+ const parser = this[kParser]
750
+
751
+ if (parser) {
752
+ parser.readMore()
753
+ }
754
+ })
755
+ addListener(socket, 'end', function () {
756
+ const parser = this[kParser]
757
+
758
+ if (parser.statusCode && !parser.shouldKeepAlive) {
759
+ const parserErr = parser.finish()
760
+ if (parserErr) {
761
+ util.destroy(this, parserErr)
762
+ }
763
+ return
764
+ }
765
+
766
+ util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))
767
+ })
768
+ addListener(socket, 'close', function () {
769
+ const client = this[kClient]
770
+ const parser = this[kParser]
771
+
772
+ clearIdleSocketValidation(this)
773
+
774
+ if (parser) {
775
+ if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
776
+ this[kError] = parser.finish() || this[kError]
777
+ }
778
+
779
+ this[kParser].destroy()
780
+ this[kParser] = null
781
+ }
782
+
783
+ const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))
784
+
785
+ client[kSocket] = null
786
+ client[kHTTPContext] = null // TODO (fix): This is hacky...
787
+
788
+ if (client.destroyed) {
789
+ assert(client[kPending] === 0)
790
+
791
+ // Fail entire queue.
792
+ const requests = client[kQueue].splice(client[kRunningIdx])
793
+ for (let i = 0; i < requests.length; i++) {
794
+ const request = requests[i]
795
+ util.errorRequest(client, request, err)
796
+ }
797
+ } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {
798
+ // Fail head of pipeline.
799
+ const request = client[kQueue][client[kRunningIdx]]
800
+ client[kQueue][client[kRunningIdx]++] = null
801
+
802
+ util.errorRequest(client, request, err)
803
+ }
804
+
805
+ client[kPendingIdx] = client[kRunningIdx]
806
+
807
+ assert(client[kRunning] === 0)
808
+
809
+ client.emit('disconnect', client[kUrl], [client], err)
810
+
811
+ client[kResume]()
812
+ })
813
+
814
+ let closed = false
815
+ socket.on('close', () => {
816
+ closed = true
817
+ })
818
+
819
+ return {
820
+ version: 'h1',
821
+ defaultPipelining: 1,
822
+ write (...args) {
823
+ return writeH1(client, ...args)
824
+ },
825
+ resume () {
826
+ resumeH1(client)
827
+ },
828
+ destroy (err, callback) {
829
+ if (closed) {
830
+ queueMicrotask(callback)
831
+ } else {
832
+ socket.destroy(err).on('close', callback)
833
+ }
834
+ },
835
+ get destroyed () {
836
+ return socket.destroyed
837
+ },
838
+ busy (request) {
839
+ if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) {
840
+ return true
841
+ }
842
+
843
+ if (request) {
844
+ if (client[kRunning] > 0 && !request.idempotent) {
845
+ // Non-idempotent request cannot be retried.
846
+ // Ensure that no other requests are inflight and
847
+ // could cause failure.
848
+ return true
849
+ }
850
+
851
+ if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {
852
+ // Don't dispatch an upgrade until all preceding requests have completed.
853
+ // A misbehaving server might upgrade the connection before all pipelined
854
+ // request has completed.
855
+ return true
856
+ }
857
+
858
+ if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&
859
+ (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) {
860
+ // Request with stream or iterator body can error while other requests
861
+ // are inflight and indirectly error those as well.
862
+ // Ensure this doesn't happen by waiting for inflight
863
+ // to complete before dispatching.
864
+
865
+ // Request with stream or iterator body cannot be retried.
866
+ // Ensure that no other requests are inflight and
867
+ // could cause failure.
868
+ return true
869
+ }
870
+ }
871
+
872
+ return false
873
+ }
874
+ }
875
+ }
876
+
877
+ function clearIdleSocketValidation (socket) {
878
+ if (socket[kIdleSocketValidationTimeout]) {
879
+ clearTimeout(socket[kIdleSocketValidationTimeout])
880
+ socket[kIdleSocketValidationTimeout] = null
881
+ }
882
+
883
+ socket[kIdleSocketValidation] = 0
884
+ }
885
+
886
+ function scheduleIdleSocketValidation (client, socket) {
887
+ socket[kIdleSocketValidation] = 1
888
+ socket[kIdleSocketValidationTimeout] = setTimeout(() => {
889
+ socket[kIdleSocketValidationTimeout] = null
890
+ socket[kIdleSocketValidation] = 2
891
+
892
+ if (client[kSocket] === socket && !socket.destroyed) {
893
+ client[kResume]()
894
+ }
895
+ }, 0)
896
+ socket[kIdleSocketValidationTimeout].unref?.()
897
+ }
898
+
899
+ /**
900
+ * @param {import('./client.js')} client
901
+ */
902
+ function resumeH1 (client) {
903
+ const socket = client[kSocket]
904
+
905
+ if (socket && !socket.destroyed) {
906
+ if (client[kSize] === 0) {
907
+ if (!socket[kNoRef] && socket.unref) {
908
+ socket.unref()
909
+ socket[kNoRef] = true
910
+ }
911
+ } else if (socket[kNoRef] && socket.ref) {
912
+ socket.ref()
913
+ socket[kNoRef] = false
914
+ }
915
+
916
+ if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) {
917
+ if (socket[kIdleSocketValidation] === 0) {
918
+ scheduleIdleSocketValidation(client, socket)
919
+ socket[kParser].readMore()
920
+ if (socket.destroyed) {
921
+ return
922
+ }
923
+ return
924
+ }
925
+
926
+ if (socket[kIdleSocketValidation] === 1) {
927
+ socket[kParser].readMore()
928
+ if (socket.destroyed) {
929
+ return
930
+ }
931
+ return
932
+ }
933
+ }
934
+
935
+ if (client[kRunning] === 0) {
936
+ socket[kParser].readMore()
937
+ if (socket.destroyed) {
938
+ return
939
+ }
940
+ }
941
+
942
+ if (client[kSize] === 0) {
943
+ if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {
944
+ socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE)
945
+ }
946
+ } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {
947
+ if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {
948
+ const request = client[kQueue][client[kRunningIdx]]
949
+ const headersTimeout = request.headersTimeout != null
950
+ ? request.headersTimeout
951
+ : client[kHeadersTimeout]
952
+ socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)
953
+ }
954
+ }
955
+ }
956
+ }
957
+
958
+ // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2
959
+ function shouldSendContentLength (method) {
960
+ return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'
961
+ }
962
+
963
+ function writeH1 (client, request) {
964
+ const { method, path, host, upgrade, blocking, reset } = request
965
+
966
+ let { body, headers, contentLength } = request
967
+
968
+ // https://tools.ietf.org/html/rfc7231#section-4.3.1
969
+ // https://tools.ietf.org/html/rfc7231#section-4.3.2
970
+ // https://tools.ietf.org/html/rfc7231#section-4.3.5
971
+
972
+ // Sending a payload body on a request that does not
973
+ // expect it can cause undefined behavior on some
974
+ // servers and corrupt connection state. Do not
975
+ // re-use the connection for further requests.
976
+
977
+ const expectsPayload = (
978
+ method === 'PUT' ||
979
+ method === 'POST' ||
980
+ method === 'PATCH' ||
981
+ method === 'QUERY' ||
982
+ method === 'PROPFIND' ||
983
+ method === 'PROPPATCH'
984
+ )
985
+
986
+ if (util.isFormDataLike(body)) {
987
+ if (!extractBody) {
988
+ extractBody = require('../web/fetch/body.js').extractBody
989
+ }
990
+
991
+ const [bodyStream, contentType] = extractBody(body)
992
+ if (request.contentType == null) {
993
+ headers.push('content-type', contentType)
994
+ }
995
+ body = bodyStream.stream
996
+ contentLength = bodyStream.length
997
+ } else if (util.isBlobLike(body) && request.contentType == null) {
998
+ const contentType = body.type
999
+ if (contentType) {
1000
+ const contentTypeValue = `${contentType}`
1001
+ if (!util.isValidHeaderValue(contentTypeValue)) {
1002
+ util.errorRequest(client, request, new InvalidArgumentError('invalid content-type header'))
1003
+ return false
1004
+ }
1005
+ headers.push('content-type', contentTypeValue)
1006
+ }
1007
+ }
1008
+
1009
+ if (body && typeof body.read === 'function') {
1010
+ // Try to read EOF in order to get length.
1011
+ body.read(0)
1012
+ }
1013
+
1014
+ const bodyLength = util.bodyLength(body)
1015
+
1016
+ contentLength = bodyLength ?? contentLength
1017
+
1018
+ if (contentLength === null) {
1019
+ contentLength = request.contentLength
1020
+ }
1021
+
1022
+ if (contentLength === 0 && !expectsPayload) {
1023
+ // https://tools.ietf.org/html/rfc7230#section-3.3.2
1024
+ // A user agent SHOULD NOT send a Content-Length header field when
1025
+ // the request message does not contain a payload body and the method
1026
+ // semantics do not anticipate such a body.
1027
+
1028
+ contentLength = null
1029
+ }
1030
+
1031
+ // https://github.com/nodejs/undici/issues/2046
1032
+ // A user agent may send a Content-Length header with 0 value, this should be allowed.
1033
+ if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
1034
+ if (client[kStrictContentLength]) {
1035
+ util.errorRequest(client, request, new RequestContentLengthMismatchError())
1036
+ return false
1037
+ }
1038
+
1039
+ process.emitWarning(new RequestContentLengthMismatchError())
1040
+ }
1041
+
1042
+ const socket = client[kSocket]
1043
+ clearIdleSocketValidation(socket)
1044
+
1045
+ const abort = (err) => {
1046
+ if (request.aborted || request.completed) {
1047
+ return
1048
+ }
1049
+
1050
+ util.errorRequest(client, request, err || new RequestAbortedError())
1051
+
1052
+ util.destroy(body)
1053
+ util.destroy(socket, new InformationalError('aborted'))
1054
+ }
1055
+
1056
+ try {
1057
+ request.onConnect(abort)
1058
+ } catch (err) {
1059
+ util.errorRequest(client, request, err)
1060
+ }
1061
+
1062
+ if (request.aborted) {
1063
+ return false
1064
+ }
1065
+
1066
+ if (method === 'HEAD') {
1067
+ // https://github.com/mcollina/undici/issues/258
1068
+ // Close after a HEAD request to interop with misbehaving servers
1069
+ // that may send a body in the response.
1070
+
1071
+ socket[kReset] = true
1072
+ }
1073
+
1074
+ if (upgrade || method === 'CONNECT') {
1075
+ // On CONNECT or upgrade, block pipeline from dispatching further
1076
+ // requests on this connection.
1077
+
1078
+ socket[kReset] = true
1079
+ }
1080
+
1081
+ if (reset != null) {
1082
+ socket[kReset] = reset
1083
+ }
1084
+
1085
+ if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {
1086
+ socket[kReset] = true
1087
+ }
1088
+
1089
+ if (blocking) {
1090
+ socket[kBlocking] = true
1091
+ }
1092
+
1093
+ let header = `${method} ${path} HTTP/1.1\r\n`
1094
+
1095
+ if (typeof host === 'string') {
1096
+ header += `host: ${host}\r\n`
1097
+ } else {
1098
+ header += client[kHostHeader]
1099
+ }
1100
+
1101
+ if (upgrade) {
1102
+ header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`
1103
+ } else if (client[kPipelining] && !socket[kReset]) {
1104
+ header += 'connection: keep-alive\r\n'
1105
+ } else {
1106
+ header += 'connection: close\r\n'
1107
+ }
1108
+
1109
+ if (Array.isArray(headers)) {
1110
+ for (let n = 0; n < headers.length; n += 2) {
1111
+ const key = headers[n + 0]
1112
+ const val = headers[n + 1]
1113
+
1114
+ if (Array.isArray(val)) {
1115
+ for (let i = 0; i < val.length; i++) {
1116
+ header += `${key}: ${val[i]}\r\n`
1117
+ }
1118
+ } else {
1119
+ header += `${key}: ${val}\r\n`
1120
+ }
1121
+ }
1122
+ }
1123
+
1124
+ if (channels.sendHeaders.hasSubscribers) {
1125
+ channels.sendHeaders.publish({ request, headers: header, socket })
1126
+ }
1127
+
1128
+ /* istanbul ignore else: assertion */
1129
+ if (!body || bodyLength === 0) {
1130
+ writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload)
1131
+ } else if (util.isBuffer(body)) {
1132
+ writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload)
1133
+ } else if (util.isBlobLike(body)) {
1134
+ if (typeof body.stream === 'function') {
1135
+ writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload)
1136
+ } else {
1137
+ writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload)
1138
+ }
1139
+ } else if (util.isStream(body)) {
1140
+ writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload)
1141
+ } else if (util.isIterable(body)) {
1142
+ writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload)
1143
+ } else {
1144
+ assert(false)
1145
+ }
1146
+
1147
+ return true
1148
+ }
1149
+
1150
+ function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) {
1151
+ assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')
1152
+
1153
+ let finished = false
1154
+
1155
+ const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })
1156
+
1157
+ const onData = function (chunk) {
1158
+ if (finished) {
1159
+ return
1160
+ }
1161
+
1162
+ try {
1163
+ if (!writer.write(chunk) && this.pause) {
1164
+ this.pause()
1165
+ }
1166
+ } catch (err) {
1167
+ util.destroy(this, err)
1168
+ }
1169
+ }
1170
+ const onDrain = function () {
1171
+ if (finished) {
1172
+ return
1173
+ }
1174
+
1175
+ if (body.resume) {
1176
+ body.resume()
1177
+ }
1178
+ }
1179
+ const onClose = function () {
1180
+ // 'close' might be emitted *before* 'error' for
1181
+ // broken streams. Wait a tick to avoid this case.
1182
+ queueMicrotask(() => {
1183
+ // It's only safe to remove 'error' listener after
1184
+ // 'close'.
1185
+ body.removeListener('error', onFinished)
1186
+ })
1187
+
1188
+ if (!finished) {
1189
+ const err = new RequestAbortedError()
1190
+ queueMicrotask(() => onFinished(err))
1191
+ }
1192
+ }
1193
+ const onFinished = function (err) {
1194
+ if (finished) {
1195
+ return
1196
+ }
1197
+
1198
+ finished = true
1199
+
1200
+ assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))
1201
+
1202
+ socket
1203
+ .off('drain', onDrain)
1204
+ .off('error', onFinished)
1205
+
1206
+ body
1207
+ .removeListener('data', onData)
1208
+ .removeListener('end', onFinished)
1209
+ .removeListener('close', onClose)
1210
+
1211
+ if (!err) {
1212
+ try {
1213
+ writer.end()
1214
+ } catch (er) {
1215
+ err = er
1216
+ }
1217
+ }
1218
+
1219
+ writer.destroy(err)
1220
+
1221
+ if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {
1222
+ util.destroy(body, err)
1223
+ } else {
1224
+ util.destroy(body)
1225
+ }
1226
+ }
1227
+
1228
+ body
1229
+ .on('data', onData)
1230
+ .on('end', onFinished)
1231
+ .on('error', onFinished)
1232
+ .on('close', onClose)
1233
+
1234
+ if (body.resume) {
1235
+ body.resume()
1236
+ }
1237
+
1238
+ socket
1239
+ .on('drain', onDrain)
1240
+ .on('error', onFinished)
1241
+
1242
+ if (body.errorEmitted ?? body.errored) {
1243
+ setImmediate(() => onFinished(body.errored))
1244
+ } else if (body.endEmitted ?? body.readableEnded) {
1245
+ setImmediate(() => onFinished(null))
1246
+ }
1247
+
1248
+ if (body.closeEmitted ?? body.closed) {
1249
+ setImmediate(onClose)
1250
+ }
1251
+ }
1252
+
1253
+ function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) {
1254
+ try {
1255
+ if (!body) {
1256
+ if (contentLength === 0) {
1257
+ socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1')
1258
+ } else {
1259
+ assert(contentLength === null, 'no body must not have content length')
1260
+ socket.write(`${header}\r\n`, 'latin1')
1261
+ }
1262
+ } else if (util.isBuffer(body)) {
1263
+ assert(contentLength === body.byteLength, 'buffer body must have content length')
1264
+
1265
+ socket.cork()
1266
+ socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1')
1267
+ socket.write(body)
1268
+ socket.uncork()
1269
+ request.onBodySent(body)
1270
+
1271
+ if (!expectsPayload && request.reset !== false) {
1272
+ socket[kReset] = true
1273
+ }
1274
+ }
1275
+ request.onRequestSent()
1276
+
1277
+ client[kResume]()
1278
+ } catch (err) {
1279
+ abort(err)
1280
+ }
1281
+ }
1282
+
1283
+ async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) {
1284
+ assert(contentLength === body.size, 'blob body must have content length')
1285
+
1286
+ try {
1287
+ if (contentLength != null && contentLength !== body.size) {
1288
+ throw new RequestContentLengthMismatchError()
1289
+ }
1290
+
1291
+ const buffer = Buffer.from(await body.arrayBuffer())
1292
+
1293
+ socket.cork()
1294
+ socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1')
1295
+ socket.write(buffer)
1296
+ socket.uncork()
1297
+
1298
+ request.onBodySent(buffer)
1299
+ request.onRequestSent()
1300
+
1301
+ if (!expectsPayload && request.reset !== false) {
1302
+ socket[kReset] = true
1303
+ }
1304
+
1305
+ client[kResume]()
1306
+ } catch (err) {
1307
+ abort(err)
1308
+ }
1309
+ }
1310
+
1311
+ async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) {
1312
+ assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')
1313
+
1314
+ let callback = null
1315
+ function onDrain () {
1316
+ if (callback) {
1317
+ const cb = callback
1318
+ callback = null
1319
+ cb()
1320
+ }
1321
+ }
1322
+
1323
+ const waitForDrain = () => new Promise((resolve, reject) => {
1324
+ assert(callback === null)
1325
+
1326
+ if (socket[kError]) {
1327
+ reject(socket[kError])
1328
+ } else {
1329
+ callback = resolve
1330
+ }
1331
+ })
1332
+
1333
+ socket
1334
+ .on('close', onDrain)
1335
+ .on('drain', onDrain)
1336
+
1337
+ const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header })
1338
+ try {
1339
+ // It's up to the user to somehow abort the async iterable.
1340
+ for await (const chunk of body) {
1341
+ if (socket[kError]) {
1342
+ throw socket[kError]
1343
+ }
1344
+
1345
+ if (!writer.write(chunk)) {
1346
+ await waitForDrain()
1347
+ }
1348
+ }
1349
+
1350
+ writer.end()
1351
+ } catch (err) {
1352
+ writer.destroy(err)
1353
+ } finally {
1354
+ socket
1355
+ .off('close', onDrain)
1356
+ .off('drain', onDrain)
1357
+ }
1358
+ }
1359
+
1360
+ class AsyncWriter {
1361
+ constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) {
1362
+ this.socket = socket
1363
+ this.request = request
1364
+ this.contentLength = contentLength
1365
+ this.client = client
1366
+ this.bytesWritten = 0
1367
+ this.expectsPayload = expectsPayload
1368
+ this.header = header
1369
+ this.abort = abort
1370
+
1371
+ socket[kWriting] = true
1372
+ }
1373
+
1374
+ write (chunk) {
1375
+ const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this
1376
+
1377
+ if (socket[kError]) {
1378
+ throw socket[kError]
1379
+ }
1380
+
1381
+ if (socket.destroyed) {
1382
+ return false
1383
+ }
1384
+
1385
+ const len = Buffer.byteLength(chunk)
1386
+ if (!len) {
1387
+ return true
1388
+ }
1389
+
1390
+ // We should defer writing chunks.
1391
+ if (contentLength !== null && bytesWritten + len > contentLength) {
1392
+ if (client[kStrictContentLength]) {
1393
+ throw new RequestContentLengthMismatchError()
1394
+ }
1395
+
1396
+ process.emitWarning(new RequestContentLengthMismatchError())
1397
+ }
1398
+
1399
+ socket.cork()
1400
+
1401
+ if (bytesWritten === 0) {
1402
+ if (!expectsPayload && request.reset !== false) {
1403
+ socket[kReset] = true
1404
+ }
1405
+
1406
+ if (contentLength === null) {
1407
+ socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1')
1408
+ } else {
1409
+ socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1')
1410
+ }
1411
+ }
1412
+
1413
+ if (contentLength === null) {
1414
+ socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1')
1415
+ }
1416
+
1417
+ this.bytesWritten += len
1418
+
1419
+ const ret = socket.write(chunk)
1420
+
1421
+ socket.uncork()
1422
+
1423
+ request.onBodySent(chunk)
1424
+
1425
+ if (!ret) {
1426
+ if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
1427
+ // istanbul ignore else: only for jest
1428
+ if (socket[kParser].timeout.refresh) {
1429
+ socket[kParser].timeout.refresh()
1430
+ }
1431
+ }
1432
+ }
1433
+
1434
+ return ret
1435
+ }
1436
+
1437
+ end () {
1438
+ const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this
1439
+ request.onRequestSent()
1440
+
1441
+ socket[kWriting] = false
1442
+
1443
+ if (socket[kError]) {
1444
+ throw socket[kError]
1445
+ }
1446
+
1447
+ if (socket.destroyed) {
1448
+ return
1449
+ }
1450
+
1451
+ if (bytesWritten === 0) {
1452
+ if (expectsPayload) {
1453
+ // https://tools.ietf.org/html/rfc7230#section-3.3.2
1454
+ // A user agent SHOULD send a Content-Length in a request message when
1455
+ // no Transfer-Encoding is sent and the request method defines a meaning
1456
+ // for an enclosed payload body.
1457
+
1458
+ socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1')
1459
+ } else {
1460
+ socket.write(`${header}\r\n`, 'latin1')
1461
+ }
1462
+ } else if (contentLength === null) {
1463
+ socket.write('\r\n0\r\n\r\n', 'latin1')
1464
+ }
1465
+
1466
+ if (contentLength !== null && bytesWritten !== contentLength) {
1467
+ if (client[kStrictContentLength]) {
1468
+ throw new RequestContentLengthMismatchError()
1469
+ } else {
1470
+ process.emitWarning(new RequestContentLengthMismatchError())
1471
+ }
1472
+ }
1473
+
1474
+ if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
1475
+ // istanbul ignore else: only for jest
1476
+ if (socket[kParser].timeout.refresh) {
1477
+ socket[kParser].timeout.refresh()
1478
+ }
1479
+ }
1480
+
1481
+ client[kResume]()
1482
+ }
1483
+
1484
+ destroy (err) {
1485
+ const { socket, client, abort } = this
1486
+
1487
+ socket[kWriting] = false
1488
+
1489
+ if (err) {
1490
+ assert(client[kRunning] <= 1, 'pipeline should only contain this request')
1491
+ abort(err)
1492
+ }
1493
+ }
1494
+ }
1495
+
1496
+ module.exports = connectH1