@pnpm/exe 11.0.6 → 11.0.8

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 (381) hide show
  1. package/dist/node-gyp-bin/node-gyp +0 -0
  2. package/dist/node-gyp-bin/node-gyp.cmd +0 -0
  3. package/dist/node_modules/node-gyp/.release-please-manifest.json +1 -1
  4. package/dist/node_modules/node-gyp/bin/node-gyp.js +0 -0
  5. package/dist/node_modules/node-gyp/gyp/.release-please-manifest.json +1 -1
  6. package/dist/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +11 -3
  7. package/dist/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +2 -3
  8. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +1 -1
  9. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2 -1
  10. package/dist/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +26 -16
  11. package/dist/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +1 -1
  12. package/dist/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1 -1
  13. package/dist/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +2 -2
  14. package/dist/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +3 -20
  15. package/dist/node_modules/node-gyp/gyp/pylib/packaging/tags.py +2 -14
  16. package/dist/node_modules/node-gyp/gyp/pyproject.toml +5 -3
  17. package/dist/node_modules/node-gyp/lib/download.js +55 -8
  18. package/dist/node_modules/node-gyp/lib/find-visualstudio.js +1 -1
  19. package/dist/node_modules/node-gyp/lib/process-release.js +17 -19
  20. package/dist/node_modules/node-gyp/package.json +3 -3
  21. package/dist/node_modules/{safer-buffer → undici}/LICENSE +1 -1
  22. package/dist/node_modules/undici/index-fetch.js +35 -0
  23. package/dist/node_modules/undici/index.js +169 -0
  24. package/dist/node_modules/undici/lib/api/abort-signal.js +57 -0
  25. package/dist/node_modules/undici/lib/api/api-connect.js +108 -0
  26. package/dist/node_modules/undici/lib/api/api-pipeline.js +251 -0
  27. package/dist/node_modules/undici/lib/api/api-request.js +214 -0
  28. package/dist/node_modules/undici/lib/api/api-stream.js +220 -0
  29. package/dist/node_modules/undici/lib/api/api-upgrade.js +108 -0
  30. package/dist/node_modules/undici/lib/api/index.js +7 -0
  31. package/dist/node_modules/undici/lib/api/readable.js +385 -0
  32. package/dist/node_modules/undici/lib/api/util.js +93 -0
  33. package/dist/node_modules/undici/lib/core/connect.js +240 -0
  34. package/dist/node_modules/undici/lib/core/constants.js +118 -0
  35. package/dist/node_modules/undici/lib/core/diagnostics.js +202 -0
  36. package/dist/node_modules/undici/lib/core/errors.js +425 -0
  37. package/dist/node_modules/undici/lib/core/request.js +405 -0
  38. package/dist/node_modules/undici/lib/core/symbols.js +67 -0
  39. package/dist/node_modules/undici/lib/core/tree.js +152 -0
  40. package/dist/node_modules/undici/lib/core/util.js +719 -0
  41. package/dist/node_modules/undici/lib/dispatcher/agent.js +130 -0
  42. package/dist/node_modules/undici/lib/dispatcher/balanced-pool.js +209 -0
  43. package/dist/node_modules/undici/lib/dispatcher/client-h1.js +1370 -0
  44. package/dist/node_modules/undici/lib/dispatcher/client-h2.js +744 -0
  45. package/dist/node_modules/undici/lib/dispatcher/client.js +623 -0
  46. package/dist/node_modules/undici/lib/dispatcher/dispatcher-base.js +198 -0
  47. package/dist/node_modules/undici/lib/dispatcher/dispatcher.js +65 -0
  48. package/dist/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +160 -0
  49. package/dist/node_modules/undici/lib/dispatcher/fixed-queue.js +117 -0
  50. package/dist/node_modules/undici/lib/dispatcher/pool-base.js +194 -0
  51. package/dist/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
  52. package/dist/node_modules/undici/lib/dispatcher/pool.js +107 -0
  53. package/dist/node_modules/undici/lib/dispatcher/proxy-agent.js +274 -0
  54. package/dist/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  55. package/dist/node_modules/undici/lib/global.js +32 -0
  56. package/dist/node_modules/undici/lib/handler/decorator-handler.js +44 -0
  57. package/dist/node_modules/undici/lib/handler/redirect-handler.js +232 -0
  58. package/dist/node_modules/undici/lib/handler/retry-handler.js +374 -0
  59. package/dist/node_modules/undici/lib/interceptor/dns.js +375 -0
  60. package/dist/node_modules/undici/lib/interceptor/dump.js +123 -0
  61. package/dist/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
  62. package/dist/node_modules/undici/lib/interceptor/redirect.js +24 -0
  63. package/dist/node_modules/undici/lib/interceptor/response-error.js +86 -0
  64. package/dist/node_modules/undici/lib/interceptor/retry.js +19 -0
  65. package/dist/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  66. package/dist/node_modules/undici/lib/llhttp/constants.js +278 -0
  67. package/dist/node_modules/undici/lib/llhttp/llhttp-wasm.js +5 -0
  68. package/dist/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +5 -0
  69. package/dist/node_modules/undici/lib/llhttp/utils.js +15 -0
  70. package/dist/node_modules/undici/lib/mock/mock-agent.js +160 -0
  71. package/dist/node_modules/undici/lib/mock/mock-client.js +59 -0
  72. package/dist/node_modules/undici/lib/mock/mock-errors.js +28 -0
  73. package/dist/node_modules/undici/lib/mock/mock-interceptor.js +207 -0
  74. package/dist/node_modules/undici/lib/mock/mock-pool.js +59 -0
  75. package/dist/node_modules/undici/lib/mock/mock-symbols.js +23 -0
  76. package/dist/node_modules/undici/lib/mock/mock-utils.js +367 -0
  77. package/dist/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  78. package/dist/node_modules/undici/lib/mock/pluralizer.js +29 -0
  79. package/dist/node_modules/undici/lib/util/timers.js +423 -0
  80. package/dist/node_modules/undici/lib/web/cache/cache.js +859 -0
  81. package/dist/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  82. package/dist/node_modules/undici/lib/web/cache/symbols.js +5 -0
  83. package/dist/node_modules/undici/lib/web/cache/util.js +45 -0
  84. package/dist/node_modules/undici/lib/web/cookies/constants.js +12 -0
  85. package/dist/node_modules/undici/lib/web/cookies/index.js +184 -0
  86. package/dist/node_modules/undici/lib/web/cookies/parse.js +317 -0
  87. package/dist/node_modules/undici/lib/web/cookies/util.js +282 -0
  88. package/dist/node_modules/undici/lib/web/eventsource/eventsource-stream.js +398 -0
  89. package/dist/node_modules/undici/lib/web/eventsource/eventsource.js +480 -0
  90. package/dist/node_modules/undici/lib/web/eventsource/util.js +37 -0
  91. package/dist/node_modules/{@npmcli/redact → undici/lib/web/fetch}/LICENSE +1 -1
  92. package/dist/node_modules/undici/lib/web/fetch/body.js +529 -0
  93. package/dist/node_modules/undici/lib/web/fetch/constants.js +124 -0
  94. package/dist/node_modules/undici/lib/web/fetch/data-url.js +744 -0
  95. package/dist/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
  96. package/dist/node_modules/undici/lib/web/fetch/file.js +126 -0
  97. package/dist/node_modules/undici/lib/web/fetch/formdata-parser.js +474 -0
  98. package/dist/node_modules/undici/lib/web/fetch/formdata.js +252 -0
  99. package/dist/node_modules/undici/lib/web/fetch/global.js +40 -0
  100. package/dist/node_modules/undici/lib/web/fetch/headers.js +687 -0
  101. package/dist/node_modules/undici/lib/web/fetch/index.js +2272 -0
  102. package/dist/node_modules/undici/lib/web/fetch/request.js +1037 -0
  103. package/dist/node_modules/undici/lib/web/fetch/response.js +610 -0
  104. package/dist/node_modules/undici/lib/web/fetch/symbols.js +9 -0
  105. package/dist/node_modules/undici/lib/web/fetch/util.js +1632 -0
  106. package/dist/node_modules/undici/lib/web/fetch/webidl.js +695 -0
  107. package/dist/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
  108. package/dist/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
  109. package/dist/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
  110. package/dist/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
  111. package/dist/node_modules/undici/lib/web/fileapi/util.js +391 -0
  112. package/dist/node_modules/undici/lib/web/websocket/connection.js +371 -0
  113. package/dist/node_modules/undici/lib/web/websocket/constants.js +66 -0
  114. package/dist/node_modules/undici/lib/web/websocket/events.js +329 -0
  115. package/dist/node_modules/undici/lib/web/websocket/frame.js +96 -0
  116. package/dist/node_modules/undici/lib/web/websocket/permessage-deflate.js +100 -0
  117. package/dist/node_modules/undici/lib/web/websocket/receiver.js +490 -0
  118. package/dist/node_modules/undici/lib/web/websocket/sender.js +104 -0
  119. package/dist/node_modules/undici/lib/web/websocket/symbols.js +12 -0
  120. package/dist/node_modules/undici/lib/web/websocket/util.js +322 -0
  121. package/dist/node_modules/undici/lib/web/websocket/websocket.js +592 -0
  122. package/dist/node_modules/undici/package.json +160 -0
  123. package/dist/node_modules/undici/scripts/strip-comments.js +8 -0
  124. package/dist/node_modules/yallist/package.json +51 -12
  125. package/dist/pnpm.mjs +4529 -3898
  126. package/dist/worker.js +76 -73
  127. package/package.json +21 -13
  128. package/setup.js +17 -3
  129. package/dist/node_modules/@gar/promise-retry/LICENSE +0 -20
  130. package/dist/node_modules/@gar/promise-retry/lib/index.js +0 -62
  131. package/dist/node_modules/@gar/promise-retry/lib/retry.js +0 -109
  132. package/dist/node_modules/@gar/promise-retry/package.json +0 -45
  133. package/dist/node_modules/@npmcli/agent/lib/agents.js +0 -206
  134. package/dist/node_modules/@npmcli/agent/lib/dns.js +0 -53
  135. package/dist/node_modules/@npmcli/agent/lib/errors.js +0 -61
  136. package/dist/node_modules/@npmcli/agent/lib/index.js +0 -56
  137. package/dist/node_modules/@npmcli/agent/lib/options.js +0 -86
  138. package/dist/node_modules/@npmcli/agent/lib/proxy.js +0 -88
  139. package/dist/node_modules/@npmcli/agent/package.json +0 -60
  140. package/dist/node_modules/@npmcli/fs/lib/common/get-options.js +0 -20
  141. package/dist/node_modules/@npmcli/fs/lib/common/node.js +0 -9
  142. package/dist/node_modules/@npmcli/fs/lib/cp/LICENSE +0 -15
  143. package/dist/node_modules/@npmcli/fs/lib/cp/errors.js +0 -129
  144. package/dist/node_modules/@npmcli/fs/lib/cp/index.js +0 -22
  145. package/dist/node_modules/@npmcli/fs/lib/cp/polyfill.js +0 -428
  146. package/dist/node_modules/@npmcli/fs/lib/index.js +0 -13
  147. package/dist/node_modules/@npmcli/fs/lib/move-file.js +0 -78
  148. package/dist/node_modules/@npmcli/fs/lib/readdir-scoped.js +0 -20
  149. package/dist/node_modules/@npmcli/fs/lib/with-temp-dir.js +0 -39
  150. package/dist/node_modules/@npmcli/fs/package.json +0 -54
  151. package/dist/node_modules/@npmcli/redact/lib/deep-map.js +0 -71
  152. package/dist/node_modules/@npmcli/redact/lib/error.js +0 -28
  153. package/dist/node_modules/@npmcli/redact/lib/index.js +0 -44
  154. package/dist/node_modules/@npmcli/redact/lib/matchers.js +0 -88
  155. package/dist/node_modules/@npmcli/redact/lib/server.js +0 -59
  156. package/dist/node_modules/@npmcli/redact/lib/utils.js +0 -202
  157. package/dist/node_modules/@npmcli/redact/package.json +0 -52
  158. package/dist/node_modules/agent-base/LICENSE +0 -22
  159. package/dist/node_modules/agent-base/dist/helpers.js +0 -66
  160. package/dist/node_modules/agent-base/dist/index.js +0 -178
  161. package/dist/node_modules/agent-base/package.json +0 -46
  162. package/dist/node_modules/balanced-match/dist/commonjs/index.js +0 -59
  163. package/dist/node_modules/balanced-match/dist/esm/index.js +0 -54
  164. package/dist/node_modules/balanced-match/package.json +0 -68
  165. package/dist/node_modules/brace-expansion/LICENSE +0 -23
  166. package/dist/node_modules/brace-expansion/dist/commonjs/index.js +0 -201
  167. package/dist/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
  168. package/dist/node_modules/brace-expansion/dist/esm/index.js +0 -197
  169. package/dist/node_modules/brace-expansion/dist/esm/package.json +0 -3
  170. package/dist/node_modules/brace-expansion/package.json +0 -64
  171. package/dist/node_modules/cacache/lib/content/path.js +0 -29
  172. package/dist/node_modules/cacache/lib/content/read.js +0 -165
  173. package/dist/node_modules/cacache/lib/content/rm.js +0 -18
  174. package/dist/node_modules/cacache/lib/content/write.js +0 -206
  175. package/dist/node_modules/cacache/lib/entry-index.js +0 -336
  176. package/dist/node_modules/cacache/lib/get.js +0 -170
  177. package/dist/node_modules/cacache/lib/index.js +0 -42
  178. package/dist/node_modules/cacache/lib/memoization.js +0 -72
  179. package/dist/node_modules/cacache/lib/put.js +0 -80
  180. package/dist/node_modules/cacache/lib/rm.js +0 -31
  181. package/dist/node_modules/cacache/lib/util/glob.js +0 -7
  182. package/dist/node_modules/cacache/lib/util/hash-to-segments.js +0 -7
  183. package/dist/node_modules/cacache/lib/util/tmp.js +0 -32
  184. package/dist/node_modules/cacache/lib/verify.js +0 -258
  185. package/dist/node_modules/cacache/package.json +0 -81
  186. package/dist/node_modules/debug/LICENSE +0 -20
  187. package/dist/node_modules/debug/package.json +0 -64
  188. package/dist/node_modules/debug/src/browser.js +0 -272
  189. package/dist/node_modules/debug/src/common.js +0 -292
  190. package/dist/node_modules/debug/src/index.js +0 -10
  191. package/dist/node_modules/debug/src/node.js +0 -263
  192. package/dist/node_modules/fs-minipass/LICENSE +0 -15
  193. package/dist/node_modules/fs-minipass/lib/index.js +0 -443
  194. package/dist/node_modules/fs-minipass/package.json +0 -54
  195. package/dist/node_modules/glob/dist/commonjs/glob.js +0 -248
  196. package/dist/node_modules/glob/dist/commonjs/has-magic.js +0 -27
  197. package/dist/node_modules/glob/dist/commonjs/ignore.js +0 -119
  198. package/dist/node_modules/glob/dist/commonjs/index.js +0 -68
  199. package/dist/node_modules/glob/dist/commonjs/index.min.js +0 -4
  200. package/dist/node_modules/glob/dist/commonjs/package.json +0 -3
  201. package/dist/node_modules/glob/dist/commonjs/pattern.js +0 -223
  202. package/dist/node_modules/glob/dist/commonjs/processor.js +0 -301
  203. package/dist/node_modules/glob/dist/commonjs/walker.js +0 -387
  204. package/dist/node_modules/glob/dist/esm/glob.js +0 -244
  205. package/dist/node_modules/glob/dist/esm/has-magic.js +0 -23
  206. package/dist/node_modules/glob/dist/esm/ignore.js +0 -115
  207. package/dist/node_modules/glob/dist/esm/index.js +0 -55
  208. package/dist/node_modules/glob/dist/esm/index.min.js +0 -4
  209. package/dist/node_modules/glob/dist/esm/package.json +0 -3
  210. package/dist/node_modules/glob/dist/esm/pattern.js +0 -219
  211. package/dist/node_modules/glob/dist/esm/processor.js +0 -294
  212. package/dist/node_modules/glob/dist/esm/walker.js +0 -381
  213. package/dist/node_modules/glob/package.json +0 -98
  214. package/dist/node_modules/http-cache-semantics/LICENSE +0 -9
  215. package/dist/node_modules/http-cache-semantics/index.js +0 -928
  216. package/dist/node_modules/http-cache-semantics/package.json +0 -22
  217. package/dist/node_modules/http-proxy-agent/LICENSE +0 -22
  218. package/dist/node_modules/http-proxy-agent/dist/index.js +0 -148
  219. package/dist/node_modules/http-proxy-agent/package.json +0 -47
  220. package/dist/node_modules/https-proxy-agent/LICENSE +0 -22
  221. package/dist/node_modules/https-proxy-agent/dist/index.js +0 -180
  222. package/dist/node_modules/https-proxy-agent/dist/parse-proxy-response.js +0 -101
  223. package/dist/node_modules/https-proxy-agent/package.json +0 -50
  224. package/dist/node_modules/iconv-lite/LICENSE +0 -21
  225. package/dist/node_modules/iconv-lite/encodings/dbcs-codec.js +0 -532
  226. package/dist/node_modules/iconv-lite/encodings/dbcs-data.js +0 -185
  227. package/dist/node_modules/iconv-lite/encodings/index.js +0 -23
  228. package/dist/node_modules/iconv-lite/encodings/internal.js +0 -218
  229. package/dist/node_modules/iconv-lite/encodings/sbcs-codec.js +0 -75
  230. package/dist/node_modules/iconv-lite/encodings/sbcs-data-generated.js +0 -451
  231. package/dist/node_modules/iconv-lite/encodings/sbcs-data.js +0 -178
  232. package/dist/node_modules/iconv-lite/encodings/tables/big5-added.json +0 -122
  233. package/dist/node_modules/iconv-lite/encodings/tables/cp936.json +0 -264
  234. package/dist/node_modules/iconv-lite/encodings/tables/cp949.json +0 -273
  235. package/dist/node_modules/iconv-lite/encodings/tables/cp950.json +0 -177
  236. package/dist/node_modules/iconv-lite/encodings/tables/eucjp.json +0 -182
  237. package/dist/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +0 -1
  238. package/dist/node_modules/iconv-lite/encodings/tables/gbk-added.json +0 -56
  239. package/dist/node_modules/iconv-lite/encodings/tables/shiftjis.json +0 -125
  240. package/dist/node_modules/iconv-lite/encodings/utf16.js +0 -187
  241. package/dist/node_modules/iconv-lite/encodings/utf32.js +0 -307
  242. package/dist/node_modules/iconv-lite/encodings/utf7.js +0 -283
  243. package/dist/node_modules/iconv-lite/lib/bom-handling.js +0 -48
  244. package/dist/node_modules/iconv-lite/lib/helpers/merge-exports.js +0 -13
  245. package/dist/node_modules/iconv-lite/lib/index.js +0 -182
  246. package/dist/node_modules/iconv-lite/lib/streams.js +0 -105
  247. package/dist/node_modules/iconv-lite/package.json +0 -70
  248. package/dist/node_modules/ip-address/LICENSE +0 -19
  249. package/dist/node_modules/ip-address/dist/address-error.js +0 -12
  250. package/dist/node_modules/ip-address/dist/common.js +0 -46
  251. package/dist/node_modules/ip-address/dist/ip-address.js +0 -35
  252. package/dist/node_modules/ip-address/dist/ipv4.js +0 -360
  253. package/dist/node_modules/ip-address/dist/ipv6.js +0 -1003
  254. package/dist/node_modules/ip-address/dist/v4/constants.js +0 -8
  255. package/dist/node_modules/ip-address/dist/v6/constants.js +0 -76
  256. package/dist/node_modules/ip-address/dist/v6/helpers.js +0 -45
  257. package/dist/node_modules/ip-address/dist/v6/regular-expressions.js +0 -95
  258. package/dist/node_modules/ip-address/package.json +0 -78
  259. package/dist/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js +0 -10
  260. package/dist/node_modules/lru-cache/dist/commonjs/index.js +0 -1692
  261. package/dist/node_modules/lru-cache/dist/commonjs/index.min.js +0 -2
  262. package/dist/node_modules/lru-cache/dist/commonjs/package.json +0 -3
  263. package/dist/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js +0 -4
  264. package/dist/node_modules/lru-cache/dist/esm/browser/index.js +0 -1688
  265. package/dist/node_modules/lru-cache/dist/esm/browser/index.min.js +0 -2
  266. package/dist/node_modules/lru-cache/dist/esm/diagnostics-channel.js +0 -19
  267. package/dist/node_modules/lru-cache/dist/esm/index.js +0 -1688
  268. package/dist/node_modules/lru-cache/dist/esm/index.min.js +0 -2
  269. package/dist/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js +0 -7
  270. package/dist/node_modules/lru-cache/dist/esm/node/index.js +0 -1688
  271. package/dist/node_modules/lru-cache/dist/esm/node/index.min.js +0 -2
  272. package/dist/node_modules/lru-cache/dist/esm/package.json +0 -3
  273. package/dist/node_modules/lru-cache/package.json +0 -126
  274. package/dist/node_modules/make-fetch-happen/LICENSE +0 -16
  275. package/dist/node_modules/make-fetch-happen/lib/cache/entry.js +0 -471
  276. package/dist/node_modules/make-fetch-happen/lib/cache/errors.js +0 -11
  277. package/dist/node_modules/make-fetch-happen/lib/cache/index.js +0 -49
  278. package/dist/node_modules/make-fetch-happen/lib/cache/key.js +0 -17
  279. package/dist/node_modules/make-fetch-happen/lib/cache/policy.js +0 -161
  280. package/dist/node_modules/make-fetch-happen/lib/fetch.js +0 -118
  281. package/dist/node_modules/make-fetch-happen/lib/index.js +0 -41
  282. package/dist/node_modules/make-fetch-happen/lib/options.js +0 -59
  283. package/dist/node_modules/make-fetch-happen/lib/pipeline.js +0 -41
  284. package/dist/node_modules/make-fetch-happen/lib/remote.js +0 -134
  285. package/dist/node_modules/make-fetch-happen/package.json +0 -75
  286. package/dist/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +0 -14
  287. package/dist/node_modules/minimatch/dist/commonjs/ast.js +0 -845
  288. package/dist/node_modules/minimatch/dist/commonjs/brace-expressions.js +0 -150
  289. package/dist/node_modules/minimatch/dist/commonjs/escape.js +0 -30
  290. package/dist/node_modules/minimatch/dist/commonjs/index.js +0 -1127
  291. package/dist/node_modules/minimatch/dist/commonjs/package.json +0 -3
  292. package/dist/node_modules/minimatch/dist/commonjs/unescape.js +0 -38
  293. package/dist/node_modules/minimatch/dist/esm/assert-valid-pattern.js +0 -10
  294. package/dist/node_modules/minimatch/dist/esm/ast.js +0 -841
  295. package/dist/node_modules/minimatch/dist/esm/brace-expressions.js +0 -146
  296. package/dist/node_modules/minimatch/dist/esm/escape.js +0 -26
  297. package/dist/node_modules/minimatch/dist/esm/index.js +0 -1114
  298. package/dist/node_modules/minimatch/dist/esm/package.json +0 -3
  299. package/dist/node_modules/minimatch/dist/esm/unescape.js +0 -34
  300. package/dist/node_modules/minimatch/package.json +0 -73
  301. package/dist/node_modules/minipass-collect/LICENSE +0 -15
  302. package/dist/node_modules/minipass-collect/index.js +0 -71
  303. package/dist/node_modules/minipass-collect/package.json +0 -30
  304. package/dist/node_modules/minipass-fetch/LICENSE +0 -28
  305. package/dist/node_modules/minipass-fetch/lib/abort-error.js +0 -17
  306. package/dist/node_modules/minipass-fetch/lib/blob.js +0 -97
  307. package/dist/node_modules/minipass-fetch/lib/body.js +0 -360
  308. package/dist/node_modules/minipass-fetch/lib/fetch-error.js +0 -32
  309. package/dist/node_modules/minipass-fetch/lib/headers.js +0 -267
  310. package/dist/node_modules/minipass-fetch/lib/index.js +0 -376
  311. package/dist/node_modules/minipass-fetch/lib/request.js +0 -282
  312. package/dist/node_modules/minipass-fetch/lib/response.js +0 -90
  313. package/dist/node_modules/minipass-fetch/package.json +0 -70
  314. package/dist/node_modules/minipass-flush/index.js +0 -39
  315. package/dist/node_modules/minipass-flush/node_modules/minipass/LICENSE +0 -15
  316. package/dist/node_modules/minipass-flush/node_modules/minipass/index.js +0 -649
  317. package/dist/node_modules/minipass-flush/node_modules/minipass/package.json +0 -56
  318. package/dist/node_modules/minipass-flush/package.json +0 -42
  319. package/dist/node_modules/minipass-pipeline/LICENSE +0 -15
  320. package/dist/node_modules/minipass-pipeline/index.js +0 -128
  321. package/dist/node_modules/minipass-pipeline/node_modules/minipass/LICENSE +0 -15
  322. package/dist/node_modules/minipass-pipeline/node_modules/minipass/index.js +0 -649
  323. package/dist/node_modules/minipass-pipeline/node_modules/minipass/package.json +0 -56
  324. package/dist/node_modules/minipass-pipeline/package.json +0 -29
  325. package/dist/node_modules/minipass-sized/LICENSE +0 -15
  326. package/dist/node_modules/minipass-sized/dist/commonjs/index.js +0 -69
  327. package/dist/node_modules/minipass-sized/dist/commonjs/package.json +0 -3
  328. package/dist/node_modules/minipass-sized/dist/esm/index.js +0 -64
  329. package/dist/node_modules/minipass-sized/dist/esm/package.json +0 -3
  330. package/dist/node_modules/minipass-sized/package.json +0 -69
  331. package/dist/node_modules/ms/index.js +0 -162
  332. package/dist/node_modules/ms/package.json +0 -38
  333. package/dist/node_modules/negotiator/LICENSE +0 -24
  334. package/dist/node_modules/negotiator/index.js +0 -83
  335. package/dist/node_modules/negotiator/lib/charset.js +0 -169
  336. package/dist/node_modules/negotiator/lib/encoding.js +0 -205
  337. package/dist/node_modules/negotiator/lib/language.js +0 -179
  338. package/dist/node_modules/negotiator/lib/mediaType.js +0 -294
  339. package/dist/node_modules/negotiator/package.json +0 -43
  340. package/dist/node_modules/p-map/index.js +0 -283
  341. package/dist/node_modules/p-map/license +0 -9
  342. package/dist/node_modules/p-map/package.json +0 -57
  343. package/dist/node_modules/path-scurry/dist/commonjs/index.js +0 -2018
  344. package/dist/node_modules/path-scurry/dist/commonjs/package.json +0 -3
  345. package/dist/node_modules/path-scurry/dist/esm/index.js +0 -1983
  346. package/dist/node_modules/path-scurry/dist/esm/package.json +0 -3
  347. package/dist/node_modules/path-scurry/package.json +0 -72
  348. package/dist/node_modules/safer-buffer/dangerous.js +0 -58
  349. package/dist/node_modules/safer-buffer/package.json +0 -34
  350. package/dist/node_modules/safer-buffer/safer.js +0 -77
  351. package/dist/node_modules/safer-buffer/tests.js +0 -406
  352. package/dist/node_modules/smart-buffer/.prettierrc.yaml +0 -5
  353. package/dist/node_modules/smart-buffer/LICENSE +0 -20
  354. package/dist/node_modules/smart-buffer/build/smartbuffer.js +0 -1233
  355. package/dist/node_modules/smart-buffer/build/utils.js +0 -108
  356. package/dist/node_modules/smart-buffer/package.json +0 -79
  357. package/dist/node_modules/socks/.eslintrc.cjs +0 -11
  358. package/dist/node_modules/socks/.prettierrc.yaml +0 -7
  359. package/dist/node_modules/socks/LICENSE +0 -20
  360. package/dist/node_modules/socks/build/client/socksclient.js +0 -793
  361. package/dist/node_modules/socks/build/common/constants.js +0 -108
  362. package/dist/node_modules/socks/build/common/helpers.js +0 -167
  363. package/dist/node_modules/socks/build/common/receivebuffer.js +0 -43
  364. package/dist/node_modules/socks/build/common/util.js +0 -25
  365. package/dist/node_modules/socks/build/index.js +0 -18
  366. package/dist/node_modules/socks/package.json +0 -58
  367. package/dist/node_modules/socks-proxy-agent/LICENSE +0 -22
  368. package/dist/node_modules/socks-proxy-agent/dist/index.js +0 -195
  369. package/dist/node_modules/socks-proxy-agent/package.json +0 -142
  370. package/dist/node_modules/ssri/lib/index.js +0 -550
  371. package/dist/node_modules/ssri/package.json +0 -66
  372. package/dist/node_modules/tar/node_modules/yallist/dist/commonjs/package.json +0 -3
  373. package/dist/node_modules/tar/node_modules/yallist/dist/esm/package.json +0 -3
  374. package/dist/node_modules/tar/node_modules/yallist/package.json +0 -68
  375. package/dist/node_modules/yallist/LICENSE +0 -15
  376. package/dist/node_modules/yallist/iterator.js +0 -8
  377. package/dist/node_modules/yallist/yallist.js +0 -426
  378. /package/dist/node_modules/{tar/node_modules/yallist → yallist}/dist/commonjs/index.js +0 -0
  379. /package/dist/node_modules/{balanced-match → yallist}/dist/commonjs/package.json +0 -0
  380. /package/dist/node_modules/{tar/node_modules/yallist → yallist}/dist/esm/index.js +0 -0
  381. /package/dist/node_modules/{balanced-match → yallist}/dist/esm/package.json +0 -0
@@ -0,0 +1,1632 @@
1
+ 'use strict'
2
+
3
+ const { Transform } = require('node:stream')
4
+ const zlib = require('node:zlib')
5
+ const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require('./constants')
6
+ const { getGlobalOrigin } = require('./global')
7
+ const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require('./data-url')
8
+ const { performance } = require('node:perf_hooks')
9
+ const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util')
10
+ const assert = require('node:assert')
11
+ const { isUint8Array } = require('node:util/types')
12
+ const { webidl } = require('./webidl')
13
+
14
+ let supportedHashes = []
15
+
16
+ // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable
17
+ /** @type {import('crypto')} */
18
+ let crypto
19
+ try {
20
+ crypto = require('node:crypto')
21
+ const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']
22
+ supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash))
23
+ /* c8 ignore next 3 */
24
+ } catch {
25
+
26
+ }
27
+
28
+ function responseURL (response) {
29
+ // https://fetch.spec.whatwg.org/#responses
30
+ // A response has an associated URL. It is a pointer to the last URL
31
+ // in response’s URL list and null if response’s URL list is empty.
32
+ const urlList = response.urlList
33
+ const length = urlList.length
34
+ return length === 0 ? null : urlList[length - 1].toString()
35
+ }
36
+
37
+ // https://fetch.spec.whatwg.org/#concept-response-location-url
38
+ function responseLocationURL (response, requestFragment) {
39
+ // 1. If response’s status is not a redirect status, then return null.
40
+ if (!redirectStatusSet.has(response.status)) {
41
+ return null
42
+ }
43
+
44
+ // 2. Let location be the result of extracting header list values given
45
+ // `Location` and response’s header list.
46
+ let location = response.headersList.get('location', true)
47
+
48
+ // 3. If location is a header value, then set location to the result of
49
+ // parsing location with response’s URL.
50
+ if (location !== null && isValidHeaderValue(location)) {
51
+ if (!isValidEncodedURL(location)) {
52
+ // Some websites respond location header in UTF-8 form without encoding them as ASCII
53
+ // and major browsers redirect them to correctly UTF-8 encoded addresses.
54
+ // Here, we handle that behavior in the same way.
55
+ location = normalizeBinaryStringToUtf8(location)
56
+ }
57
+ location = new URL(location, responseURL(response))
58
+ }
59
+
60
+ // 4. If location is a URL whose fragment is null, then set location’s
61
+ // fragment to requestFragment.
62
+ if (location && !location.hash) {
63
+ location.hash = requestFragment
64
+ }
65
+
66
+ // 5. Return location.
67
+ return location
68
+ }
69
+
70
+ /**
71
+ * @see https://www.rfc-editor.org/rfc/rfc1738#section-2.2
72
+ * @param {string} url
73
+ * @returns {boolean}
74
+ */
75
+ function isValidEncodedURL (url) {
76
+ for (let i = 0; i < url.length; ++i) {
77
+ const code = url.charCodeAt(i)
78
+
79
+ if (
80
+ code > 0x7E || // Non-US-ASCII + DEL
81
+ code < 0x20 // Control characters NUL - US
82
+ ) {
83
+ return false
84
+ }
85
+ }
86
+ return true
87
+ }
88
+
89
+ /**
90
+ * If string contains non-ASCII characters, assumes it's UTF-8 encoded and decodes it.
91
+ * Since UTF-8 is a superset of ASCII, this will work for ASCII strings as well.
92
+ * @param {string} value
93
+ * @returns {string}
94
+ */
95
+ function normalizeBinaryStringToUtf8 (value) {
96
+ return Buffer.from(value, 'binary').toString('utf8')
97
+ }
98
+
99
+ /** @returns {URL} */
100
+ function requestCurrentURL (request) {
101
+ return request.urlList[request.urlList.length - 1]
102
+ }
103
+
104
+ function requestBadPort (request) {
105
+ // 1. Let url be request’s current URL.
106
+ const url = requestCurrentURL(request)
107
+
108
+ // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,
109
+ // then return blocked.
110
+ if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
111
+ return 'blocked'
112
+ }
113
+
114
+ // 3. Return allowed.
115
+ return 'allowed'
116
+ }
117
+
118
+ function isErrorLike (object) {
119
+ return object instanceof Error || (
120
+ object?.constructor?.name === 'Error' ||
121
+ object?.constructor?.name === 'DOMException'
122
+ )
123
+ }
124
+
125
+ // Check whether |statusText| is a ByteString and
126
+ // matches the Reason-Phrase token production.
127
+ // RFC 2616: https://tools.ietf.org/html/rfc2616
128
+ // RFC 7230: https://tools.ietf.org/html/rfc7230
129
+ // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )"
130
+ // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116
131
+ function isValidReasonPhrase (statusText) {
132
+ for (let i = 0; i < statusText.length; ++i) {
133
+ const c = statusText.charCodeAt(i)
134
+ if (
135
+ !(
136
+ (
137
+ c === 0x09 || // HTAB
138
+ (c >= 0x20 && c <= 0x7e) || // SP / VCHAR
139
+ (c >= 0x80 && c <= 0xff)
140
+ ) // obs-text
141
+ )
142
+ ) {
143
+ return false
144
+ }
145
+ }
146
+ return true
147
+ }
148
+
149
+ /**
150
+ * @see https://fetch.spec.whatwg.org/#header-name
151
+ * @param {string} potentialValue
152
+ */
153
+ const isValidHeaderName = isValidHTTPToken
154
+
155
+ /**
156
+ * @see https://fetch.spec.whatwg.org/#header-value
157
+ * @param {string} potentialValue
158
+ */
159
+ function isValidHeaderValue (potentialValue) {
160
+ // - Has no leading or trailing HTTP tab or space bytes.
161
+ // - Contains no 0x00 (NUL) or HTTP newline bytes.
162
+ return (
163
+ potentialValue[0] === '\t' ||
164
+ potentialValue[0] === ' ' ||
165
+ potentialValue[potentialValue.length - 1] === '\t' ||
166
+ potentialValue[potentialValue.length - 1] === ' ' ||
167
+ potentialValue.includes('\n') ||
168
+ potentialValue.includes('\r') ||
169
+ potentialValue.includes('\0')
170
+ ) === false
171
+ }
172
+
173
+ // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect
174
+ function setRequestReferrerPolicyOnRedirect (request, actualResponse) {
175
+ // Given a request request and a response actualResponse, this algorithm
176
+ // updates request’s referrer policy according to the Referrer-Policy
177
+ // header (if any) in actualResponse.
178
+
179
+ // 1. Let policy be the result of executing § 8.1 Parse a referrer policy
180
+ // from a Referrer-Policy header on actualResponse.
181
+
182
+ // 8.1 Parse a referrer policy from a Referrer-Policy header
183
+ // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.
184
+ const { headersList } = actualResponse
185
+ // 2. Let policy be the empty string.
186
+ // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.
187
+ // 4. Return policy.
188
+ const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(',')
189
+
190
+ // Note: As the referrer-policy can contain multiple policies
191
+ // separated by comma, we need to loop through all of them
192
+ // and pick the first valid one.
193
+ // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy
194
+ let policy = ''
195
+ if (policyHeader.length > 0) {
196
+ // The right-most policy takes precedence.
197
+ // The left-most policy is the fallback.
198
+ for (let i = policyHeader.length; i !== 0; i--) {
199
+ const token = policyHeader[i - 1].trim()
200
+ if (referrerPolicyTokens.has(token)) {
201
+ policy = token
202
+ break
203
+ }
204
+ }
205
+ }
206
+
207
+ // 2. If policy is not the empty string, then set request’s referrer policy to policy.
208
+ if (policy !== '') {
209
+ request.referrerPolicy = policy
210
+ }
211
+ }
212
+
213
+ // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check
214
+ function crossOriginResourcePolicyCheck () {
215
+ // TODO
216
+ return 'allowed'
217
+ }
218
+
219
+ // https://fetch.spec.whatwg.org/#concept-cors-check
220
+ function corsCheck () {
221
+ // TODO
222
+ return 'success'
223
+ }
224
+
225
+ // https://fetch.spec.whatwg.org/#concept-tao-check
226
+ function TAOCheck () {
227
+ // TODO
228
+ return 'success'
229
+ }
230
+
231
+ function appendFetchMetadata (httpRequest) {
232
+ // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header
233
+ // TODO
234
+
235
+ // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header
236
+
237
+ // 1. Assert: r’s url is a potentially trustworthy URL.
238
+ // TODO
239
+
240
+ // 2. Let header be a Structured Header whose value is a token.
241
+ let header = null
242
+
243
+ // 3. Set header’s value to r’s mode.
244
+ header = httpRequest.mode
245
+
246
+ // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.
247
+ httpRequest.headersList.set('sec-fetch-mode', header, true)
248
+
249
+ // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header
250
+ // TODO
251
+
252
+ // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header
253
+ // TODO
254
+ }
255
+
256
+ // https://fetch.spec.whatwg.org/#append-a-request-origin-header
257
+ function appendRequestOriginHeader (request) {
258
+ // 1. Let serializedOrigin be the result of byte-serializing a request origin
259
+ // with request.
260
+ // TODO: implement "byte-serializing a request origin"
261
+ let serializedOrigin = request.origin
262
+
263
+ // - "'client' is changed to an origin during fetching."
264
+ // This doesn't happen in undici (in most cases) because undici, by default,
265
+ // has no concept of origin.
266
+ // - request.origin can also be set to request.client.origin (client being
267
+ // an environment settings object), which is undefined without using
268
+ // setGlobalOrigin.
269
+ if (serializedOrigin === 'client' || serializedOrigin === undefined) {
270
+ return
271
+ }
272
+
273
+ // 2. If request’s response tainting is "cors" or request’s mode is "websocket",
274
+ // then append (`Origin`, serializedOrigin) to request’s header list.
275
+ // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:
276
+ if (request.responseTainting === 'cors' || request.mode === 'websocket') {
277
+ request.headersList.append('origin', serializedOrigin, true)
278
+ } else if (request.method !== 'GET' && request.method !== 'HEAD') {
279
+ // 1. Switch on request’s referrer policy:
280
+ switch (request.referrerPolicy) {
281
+ case 'no-referrer':
282
+ // Set serializedOrigin to `null`.
283
+ serializedOrigin = null
284
+ break
285
+ case 'no-referrer-when-downgrade':
286
+ case 'strict-origin':
287
+ case 'strict-origin-when-cross-origin':
288
+ // If request’s origin is a tuple origin, its scheme is "https", and
289
+ // request’s current URL’s scheme is not "https", then set
290
+ // serializedOrigin to `null`.
291
+ if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {
292
+ serializedOrigin = null
293
+ }
294
+ break
295
+ case 'same-origin':
296
+ // If request’s origin is not same origin with request’s current URL’s
297
+ // origin, then set serializedOrigin to `null`.
298
+ if (!sameOrigin(request, requestCurrentURL(request))) {
299
+ serializedOrigin = null
300
+ }
301
+ break
302
+ default:
303
+ // Do nothing.
304
+ }
305
+
306
+ // 2. Append (`Origin`, serializedOrigin) to request’s header list.
307
+ request.headersList.append('origin', serializedOrigin, true)
308
+ }
309
+ }
310
+
311
+ // https://w3c.github.io/hr-time/#dfn-coarsen-time
312
+ function coarsenTime (timestamp, crossOriginIsolatedCapability) {
313
+ // TODO
314
+ return timestamp
315
+ }
316
+
317
+ // https://fetch.spec.whatwg.org/#clamp-and-coarsen-connection-timing-info
318
+ function clampAndCoarsenConnectionTimingInfo (connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) {
319
+ if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) {
320
+ return {
321
+ domainLookupStartTime: defaultStartTime,
322
+ domainLookupEndTime: defaultStartTime,
323
+ connectionStartTime: defaultStartTime,
324
+ connectionEndTime: defaultStartTime,
325
+ secureConnectionStartTime: defaultStartTime,
326
+ ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol
327
+ }
328
+ }
329
+
330
+ return {
331
+ domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability),
332
+ domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability),
333
+ connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability),
334
+ connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability),
335
+ secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability),
336
+ ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol
337
+ }
338
+ }
339
+
340
+ // https://w3c.github.io/hr-time/#dfn-coarsened-shared-current-time
341
+ function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {
342
+ return coarsenTime(performance.now(), crossOriginIsolatedCapability)
343
+ }
344
+
345
+ // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info
346
+ function createOpaqueTimingInfo (timingInfo) {
347
+ return {
348
+ startTime: timingInfo.startTime ?? 0,
349
+ redirectStartTime: 0,
350
+ redirectEndTime: 0,
351
+ postRedirectStartTime: timingInfo.startTime ?? 0,
352
+ finalServiceWorkerStartTime: 0,
353
+ finalNetworkResponseStartTime: 0,
354
+ finalNetworkRequestStartTime: 0,
355
+ endTime: 0,
356
+ encodedBodySize: 0,
357
+ decodedBodySize: 0,
358
+ finalConnectionTimingInfo: null
359
+ }
360
+ }
361
+
362
+ // https://html.spec.whatwg.org/multipage/origin.html#policy-container
363
+ function makePolicyContainer () {
364
+ // Note: the fetch spec doesn't make use of embedder policy or CSP list
365
+ return {
366
+ referrerPolicy: 'strict-origin-when-cross-origin'
367
+ }
368
+ }
369
+
370
+ // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container
371
+ function clonePolicyContainer (policyContainer) {
372
+ return {
373
+ referrerPolicy: policyContainer.referrerPolicy
374
+ }
375
+ }
376
+
377
+ // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
378
+ function determineRequestsReferrer (request) {
379
+ // 1. Let policy be request's referrer policy.
380
+ const policy = request.referrerPolicy
381
+
382
+ // Note: policy cannot (shouldn't) be null or an empty string.
383
+ assert(policy)
384
+
385
+ // 2. Let environment be request’s client.
386
+
387
+ let referrerSource = null
388
+
389
+ // 3. Switch on request’s referrer:
390
+ if (request.referrer === 'client') {
391
+ // Note: node isn't a browser and doesn't implement document/iframes,
392
+ // so we bypass this step and replace it with our own.
393
+
394
+ const globalOrigin = getGlobalOrigin()
395
+
396
+ if (!globalOrigin || globalOrigin.origin === 'null') {
397
+ return 'no-referrer'
398
+ }
399
+
400
+ // note: we need to clone it as it's mutated
401
+ referrerSource = new URL(globalOrigin)
402
+ } else if (request.referrer instanceof URL) {
403
+ // Let referrerSource be request’s referrer.
404
+ referrerSource = request.referrer
405
+ }
406
+
407
+ // 4. Let request’s referrerURL be the result of stripping referrerSource for
408
+ // use as a referrer.
409
+ let referrerURL = stripURLForReferrer(referrerSource)
410
+
411
+ // 5. Let referrerOrigin be the result of stripping referrerSource for use as
412
+ // a referrer, with the origin-only flag set to true.
413
+ const referrerOrigin = stripURLForReferrer(referrerSource, true)
414
+
415
+ // 6. If the result of serializing referrerURL is a string whose length is
416
+ // greater than 4096, set referrerURL to referrerOrigin.
417
+ if (referrerURL.toString().length > 4096) {
418
+ referrerURL = referrerOrigin
419
+ }
420
+
421
+ const areSameOrigin = sameOrigin(request, referrerURL)
422
+ const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) &&
423
+ !isURLPotentiallyTrustworthy(request.url)
424
+
425
+ // 8. Execute the switch statements corresponding to the value of policy:
426
+ switch (policy) {
427
+ case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true)
428
+ case 'unsafe-url': return referrerURL
429
+ case 'same-origin':
430
+ return areSameOrigin ? referrerOrigin : 'no-referrer'
431
+ case 'origin-when-cross-origin':
432
+ return areSameOrigin ? referrerURL : referrerOrigin
433
+ case 'strict-origin-when-cross-origin': {
434
+ const currentURL = requestCurrentURL(request)
435
+
436
+ // 1. If the origin of referrerURL and the origin of request’s current
437
+ // URL are the same, then return referrerURL.
438
+ if (sameOrigin(referrerURL, currentURL)) {
439
+ return referrerURL
440
+ }
441
+
442
+ // 2. If referrerURL is a potentially trustworthy URL and request’s
443
+ // current URL is not a potentially trustworthy URL, then return no
444
+ // referrer.
445
+ if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
446
+ return 'no-referrer'
447
+ }
448
+
449
+ // 3. Return referrerOrigin.
450
+ return referrerOrigin
451
+ }
452
+ case 'strict-origin': // eslint-disable-line
453
+ /**
454
+ * 1. If referrerURL is a potentially trustworthy URL and
455
+ * request’s current URL is not a potentially trustworthy URL,
456
+ * then return no referrer.
457
+ * 2. Return referrerOrigin
458
+ */
459
+ case 'no-referrer-when-downgrade': // eslint-disable-line
460
+ /**
461
+ * 1. If referrerURL is a potentially trustworthy URL and
462
+ * request’s current URL is not a potentially trustworthy URL,
463
+ * then return no referrer.
464
+ * 2. Return referrerOrigin
465
+ */
466
+
467
+ default: // eslint-disable-line
468
+ return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin
469
+ }
470
+ }
471
+
472
+ /**
473
+ * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url
474
+ * @param {URL} url
475
+ * @param {boolean|undefined} originOnly
476
+ */
477
+ function stripURLForReferrer (url, originOnly) {
478
+ // 1. Assert: url is a URL.
479
+ assert(url instanceof URL)
480
+
481
+ url = new URL(url)
482
+
483
+ // 2. If url’s scheme is a local scheme, then return no referrer.
484
+ if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') {
485
+ return 'no-referrer'
486
+ }
487
+
488
+ // 3. Set url’s username to the empty string.
489
+ url.username = ''
490
+
491
+ // 4. Set url’s password to the empty string.
492
+ url.password = ''
493
+
494
+ // 5. Set url’s fragment to null.
495
+ url.hash = ''
496
+
497
+ // 6. If the origin-only flag is true, then:
498
+ if (originOnly) {
499
+ // 1. Set url’s path to « the empty string ».
500
+ url.pathname = ''
501
+
502
+ // 2. Set url’s query to null.
503
+ url.search = ''
504
+ }
505
+
506
+ // 7. Return url.
507
+ return url
508
+ }
509
+
510
+ function isURLPotentiallyTrustworthy (url) {
511
+ if (!(url instanceof URL)) {
512
+ return false
513
+ }
514
+
515
+ // If child of about, return true
516
+ if (url.href === 'about:blank' || url.href === 'about:srcdoc') {
517
+ return true
518
+ }
519
+
520
+ // If scheme is data, return true
521
+ if (url.protocol === 'data:') return true
522
+
523
+ // If file, return true
524
+ if (url.protocol === 'file:') return true
525
+
526
+ return isOriginPotentiallyTrustworthy(url.origin)
527
+
528
+ function isOriginPotentiallyTrustworthy (origin) {
529
+ // If origin is explicitly null, return false
530
+ if (origin == null || origin === 'null') return false
531
+
532
+ const originAsURL = new URL(origin)
533
+
534
+ // If secure, return true
535
+ if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') {
536
+ return true
537
+ }
538
+
539
+ // If localhost or variants, return true
540
+ if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) ||
541
+ (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) ||
542
+ (originAsURL.hostname.endsWith('.localhost'))) {
543
+ return true
544
+ }
545
+
546
+ // If any other, return false
547
+ return false
548
+ }
549
+ }
550
+
551
+ /**
552
+ * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist
553
+ * @param {Uint8Array} bytes
554
+ * @param {string} metadataList
555
+ */
556
+ function bytesMatch (bytes, metadataList) {
557
+ // If node is not built with OpenSSL support, we cannot check
558
+ // a request's integrity, so allow it by default (the spec will
559
+ // allow requests if an invalid hash is given, as precedence).
560
+ /* istanbul ignore if: only if node is built with --without-ssl */
561
+ if (crypto === undefined) {
562
+ return true
563
+ }
564
+
565
+ // 1. Let parsedMetadata be the result of parsing metadataList.
566
+ const parsedMetadata = parseMetadata(metadataList)
567
+
568
+ // 2. If parsedMetadata is no metadata, return true.
569
+ if (parsedMetadata === 'no metadata') {
570
+ return true
571
+ }
572
+
573
+ // 3. If response is not eligible for integrity validation, return false.
574
+ // TODO
575
+
576
+ // 4. If parsedMetadata is the empty set, return true.
577
+ if (parsedMetadata.length === 0) {
578
+ return true
579
+ }
580
+
581
+ // 5. Let metadata be the result of getting the strongest
582
+ // metadata from parsedMetadata.
583
+ const strongest = getStrongestMetadata(parsedMetadata)
584
+ const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest)
585
+
586
+ // 6. For each item in metadata:
587
+ for (const item of metadata) {
588
+ // 1. Let algorithm be the alg component of item.
589
+ const algorithm = item.algo
590
+
591
+ // 2. Let expectedValue be the val component of item.
592
+ const expectedValue = item.hash
593
+
594
+ // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e
595
+ // "be liberal with padding". This is annoying, and it's not even in the spec.
596
+
597
+ // 3. Let actualValue be the result of applying algorithm to bytes.
598
+ let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64')
599
+
600
+ if (actualValue[actualValue.length - 1] === '=') {
601
+ if (actualValue[actualValue.length - 2] === '=') {
602
+ actualValue = actualValue.slice(0, -2)
603
+ } else {
604
+ actualValue = actualValue.slice(0, -1)
605
+ }
606
+ }
607
+
608
+ // 4. If actualValue is a case-sensitive match for expectedValue,
609
+ // return true.
610
+ if (compareBase64Mixed(actualValue, expectedValue)) {
611
+ return true
612
+ }
613
+ }
614
+
615
+ // 7. Return false.
616
+ return false
617
+ }
618
+
619
+ // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options
620
+ // https://www.w3.org/TR/CSP2/#source-list-syntax
621
+ // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1
622
+ const parseHashWithOptions = /(?<algo>sha256|sha384|sha512)-((?<hash>[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i
623
+
624
+ /**
625
+ * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata
626
+ * @param {string} metadata
627
+ */
628
+ function parseMetadata (metadata) {
629
+ // 1. Let result be the empty set.
630
+ /** @type {{ algo: string, hash: string }[]} */
631
+ const result = []
632
+
633
+ // 2. Let empty be equal to true.
634
+ let empty = true
635
+
636
+ // 3. For each token returned by splitting metadata on spaces:
637
+ for (const token of metadata.split(' ')) {
638
+ // 1. Set empty to false.
639
+ empty = false
640
+
641
+ // 2. Parse token as a hash-with-options.
642
+ const parsedToken = parseHashWithOptions.exec(token)
643
+
644
+ // 3. If token does not parse, continue to the next token.
645
+ if (
646
+ parsedToken === null ||
647
+ parsedToken.groups === undefined ||
648
+ parsedToken.groups.algo === undefined
649
+ ) {
650
+ // Note: Chromium blocks the request at this point, but Firefox
651
+ // gives a warning that an invalid integrity was given. The
652
+ // correct behavior is to ignore these, and subsequently not
653
+ // check the integrity of the resource.
654
+ continue
655
+ }
656
+
657
+ // 4. Let algorithm be the hash-algo component of token.
658
+ const algorithm = parsedToken.groups.algo.toLowerCase()
659
+
660
+ // 5. If algorithm is a hash function recognized by the user
661
+ // agent, add the parsed token to result.
662
+ if (supportedHashes.includes(algorithm)) {
663
+ result.push(parsedToken.groups)
664
+ }
665
+ }
666
+
667
+ // 4. Return no metadata if empty is true, otherwise return result.
668
+ if (empty === true) {
669
+ return 'no metadata'
670
+ }
671
+
672
+ return result
673
+ }
674
+
675
+ /**
676
+ * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList
677
+ */
678
+ function getStrongestMetadata (metadataList) {
679
+ // Let algorithm be the algo component of the first item in metadataList.
680
+ // Can be sha256
681
+ let algorithm = metadataList[0].algo
682
+ // If the algorithm is sha512, then it is the strongest
683
+ // and we can return immediately
684
+ if (algorithm[3] === '5') {
685
+ return algorithm
686
+ }
687
+
688
+ for (let i = 1; i < metadataList.length; ++i) {
689
+ const metadata = metadataList[i]
690
+ // If the algorithm is sha512, then it is the strongest
691
+ // and we can break the loop immediately
692
+ if (metadata.algo[3] === '5') {
693
+ algorithm = 'sha512'
694
+ break
695
+ // If the algorithm is sha384, then a potential sha256 or sha384 is ignored
696
+ } else if (algorithm[3] === '3') {
697
+ continue
698
+ // algorithm is sha256, check if algorithm is sha384 and if so, set it as
699
+ // the strongest
700
+ } else if (metadata.algo[3] === '3') {
701
+ algorithm = 'sha384'
702
+ }
703
+ }
704
+ return algorithm
705
+ }
706
+
707
+ function filterMetadataListByAlgorithm (metadataList, algorithm) {
708
+ if (metadataList.length === 1) {
709
+ return metadataList
710
+ }
711
+
712
+ let pos = 0
713
+ for (let i = 0; i < metadataList.length; ++i) {
714
+ if (metadataList[i].algo === algorithm) {
715
+ metadataList[pos++] = metadataList[i]
716
+ }
717
+ }
718
+
719
+ metadataList.length = pos
720
+
721
+ return metadataList
722
+ }
723
+
724
+ /**
725
+ * Compares two base64 strings, allowing for base64url
726
+ * in the second string.
727
+ *
728
+ * @param {string} actualValue always base64
729
+ * @param {string} expectedValue base64 or base64url
730
+ * @returns {boolean}
731
+ */
732
+ function compareBase64Mixed (actualValue, expectedValue) {
733
+ if (actualValue.length !== expectedValue.length) {
734
+ return false
735
+ }
736
+ for (let i = 0; i < actualValue.length; ++i) {
737
+ if (actualValue[i] !== expectedValue[i]) {
738
+ if (
739
+ (actualValue[i] === '+' && expectedValue[i] === '-') ||
740
+ (actualValue[i] === '/' && expectedValue[i] === '_')
741
+ ) {
742
+ continue
743
+ }
744
+ return false
745
+ }
746
+ }
747
+
748
+ return true
749
+ }
750
+
751
+ // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request
752
+ function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {
753
+ // TODO
754
+ }
755
+
756
+ /**
757
+ * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}
758
+ * @param {URL} A
759
+ * @param {URL} B
760
+ */
761
+ function sameOrigin (A, B) {
762
+ // 1. If A and B are the same opaque origin, then return true.
763
+ if (A.origin === B.origin && A.origin === 'null') {
764
+ return true
765
+ }
766
+
767
+ // 2. If A and B are both tuple origins and their schemes,
768
+ // hosts, and port are identical, then return true.
769
+ if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {
770
+ return true
771
+ }
772
+
773
+ // 3. Return false.
774
+ return false
775
+ }
776
+
777
+ function createDeferredPromise () {
778
+ let res
779
+ let rej
780
+ const promise = new Promise((resolve, reject) => {
781
+ res = resolve
782
+ rej = reject
783
+ })
784
+
785
+ return { promise, resolve: res, reject: rej }
786
+ }
787
+
788
+ function isAborted (fetchParams) {
789
+ return fetchParams.controller.state === 'aborted'
790
+ }
791
+
792
+ function isCancelled (fetchParams) {
793
+ return fetchParams.controller.state === 'aborted' ||
794
+ fetchParams.controller.state === 'terminated'
795
+ }
796
+
797
+ /**
798
+ * @see https://fetch.spec.whatwg.org/#concept-method-normalize
799
+ * @param {string} method
800
+ */
801
+ function normalizeMethod (method) {
802
+ return normalizedMethodRecordsBase[method.toLowerCase()] ?? method
803
+ }
804
+
805
+ // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
806
+ function serializeJavascriptValueToJSONString (value) {
807
+ // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).
808
+ const result = JSON.stringify(value)
809
+
810
+ // 2. If result is undefined, then throw a TypeError.
811
+ if (result === undefined) {
812
+ throw new TypeError('Value is not JSON serializable')
813
+ }
814
+
815
+ // 3. Assert: result is a string.
816
+ assert(typeof result === 'string')
817
+
818
+ // 4. Return result.
819
+ return result
820
+ }
821
+
822
+ // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object
823
+ const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))
824
+
825
+ /**
826
+ * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
827
+ * @param {string} name name of the instance
828
+ * @param {symbol} kInternalIterator
829
+ * @param {string | number} [keyIndex]
830
+ * @param {string | number} [valueIndex]
831
+ */
832
+ function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) {
833
+ class FastIterableIterator {
834
+ /** @type {any} */
835
+ #target
836
+ /** @type {'key' | 'value' | 'key+value'} */
837
+ #kind
838
+ /** @type {number} */
839
+ #index
840
+
841
+ /**
842
+ * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object
843
+ * @param {unknown} target
844
+ * @param {'key' | 'value' | 'key+value'} kind
845
+ */
846
+ constructor (target, kind) {
847
+ this.#target = target
848
+ this.#kind = kind
849
+ this.#index = 0
850
+ }
851
+
852
+ next () {
853
+ // 1. Let interface be the interface for which the iterator prototype object exists.
854
+ // 2. Let thisValue be the this value.
855
+ // 3. Let object be ? ToObject(thisValue).
856
+ // 4. If object is a platform object, then perform a security
857
+ // check, passing:
858
+ // 5. If object is not a default iterator object for interface,
859
+ // then throw a TypeError.
860
+ if (typeof this !== 'object' || this === null || !(#target in this)) {
861
+ throw new TypeError(
862
+ `'next' called on an object that does not implement interface ${name} Iterator.`
863
+ )
864
+ }
865
+
866
+ // 6. Let index be object’s index.
867
+ // 7. Let kind be object’s kind.
868
+ // 8. Let values be object’s target's value pairs to iterate over.
869
+ const index = this.#index
870
+ const values = this.#target[kInternalIterator]
871
+
872
+ // 9. Let len be the length of values.
873
+ const len = values.length
874
+
875
+ // 10. If index is greater than or equal to len, then return
876
+ // CreateIterResultObject(undefined, true).
877
+ if (index >= len) {
878
+ return {
879
+ value: undefined,
880
+ done: true
881
+ }
882
+ }
883
+
884
+ // 11. Let pair be the entry in values at index index.
885
+ const { [keyIndex]: key, [valueIndex]: value } = values[index]
886
+
887
+ // 12. Set object’s index to index + 1.
888
+ this.#index = index + 1
889
+
890
+ // 13. Return the iterator result for pair and kind.
891
+
892
+ // https://webidl.spec.whatwg.org/#iterator-result
893
+
894
+ // 1. Let result be a value determined by the value of kind:
895
+ let result
896
+ switch (this.#kind) {
897
+ case 'key':
898
+ // 1. Let idlKey be pair’s key.
899
+ // 2. Let key be the result of converting idlKey to an
900
+ // ECMAScript value.
901
+ // 3. result is key.
902
+ result = key
903
+ break
904
+ case 'value':
905
+ // 1. Let idlValue be pair’s value.
906
+ // 2. Let value be the result of converting idlValue to
907
+ // an ECMAScript value.
908
+ // 3. result is value.
909
+ result = value
910
+ break
911
+ case 'key+value':
912
+ // 1. Let idlKey be pair’s key.
913
+ // 2. Let idlValue be pair’s value.
914
+ // 3. Let key be the result of converting idlKey to an
915
+ // ECMAScript value.
916
+ // 4. Let value be the result of converting idlValue to
917
+ // an ECMAScript value.
918
+ // 5. Let array be ! ArrayCreate(2).
919
+ // 6. Call ! CreateDataProperty(array, "0", key).
920
+ // 7. Call ! CreateDataProperty(array, "1", value).
921
+ // 8. result is array.
922
+ result = [key, value]
923
+ break
924
+ }
925
+
926
+ // 2. Return CreateIterResultObject(result, false).
927
+ return {
928
+ value: result,
929
+ done: false
930
+ }
931
+ }
932
+ }
933
+
934
+ // https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
935
+ // @ts-ignore
936
+ delete FastIterableIterator.prototype.constructor
937
+
938
+ Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype)
939
+
940
+ Object.defineProperties(FastIterableIterator.prototype, {
941
+ [Symbol.toStringTag]: {
942
+ writable: false,
943
+ enumerable: false,
944
+ configurable: true,
945
+ value: `${name} Iterator`
946
+ },
947
+ next: { writable: true, enumerable: true, configurable: true }
948
+ })
949
+
950
+ /**
951
+ * @param {unknown} target
952
+ * @param {'key' | 'value' | 'key+value'} kind
953
+ * @returns {IterableIterator<any>}
954
+ */
955
+ return function (target, kind) {
956
+ return new FastIterableIterator(target, kind)
957
+ }
958
+ }
959
+
960
+ /**
961
+ * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
962
+ * @param {string} name name of the instance
963
+ * @param {any} object class
964
+ * @param {symbol} kInternalIterator
965
+ * @param {string | number} [keyIndex]
966
+ * @param {string | number} [valueIndex]
967
+ */
968
+ function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueIndex = 1) {
969
+ const makeIterator = createIterator(name, kInternalIterator, keyIndex, valueIndex)
970
+
971
+ const properties = {
972
+ keys: {
973
+ writable: true,
974
+ enumerable: true,
975
+ configurable: true,
976
+ value: function keys () {
977
+ webidl.brandCheck(this, object)
978
+ return makeIterator(this, 'key')
979
+ }
980
+ },
981
+ values: {
982
+ writable: true,
983
+ enumerable: true,
984
+ configurable: true,
985
+ value: function values () {
986
+ webidl.brandCheck(this, object)
987
+ return makeIterator(this, 'value')
988
+ }
989
+ },
990
+ entries: {
991
+ writable: true,
992
+ enumerable: true,
993
+ configurable: true,
994
+ value: function entries () {
995
+ webidl.brandCheck(this, object)
996
+ return makeIterator(this, 'key+value')
997
+ }
998
+ },
999
+ forEach: {
1000
+ writable: true,
1001
+ enumerable: true,
1002
+ configurable: true,
1003
+ value: function forEach (callbackfn, thisArg = globalThis) {
1004
+ webidl.brandCheck(this, object)
1005
+ webidl.argumentLengthCheck(arguments, 1, `${name}.forEach`)
1006
+ if (typeof callbackfn !== 'function') {
1007
+ throw new TypeError(
1008
+ `Failed to execute 'forEach' on '${name}': parameter 1 is not of type 'Function'.`
1009
+ )
1010
+ }
1011
+ for (const { 0: key, 1: value } of makeIterator(this, 'key+value')) {
1012
+ callbackfn.call(thisArg, value, key, this)
1013
+ }
1014
+ }
1015
+ }
1016
+ }
1017
+
1018
+ return Object.defineProperties(object.prototype, {
1019
+ ...properties,
1020
+ [Symbol.iterator]: {
1021
+ writable: true,
1022
+ enumerable: false,
1023
+ configurable: true,
1024
+ value: properties.entries.value
1025
+ }
1026
+ })
1027
+ }
1028
+
1029
+ /**
1030
+ * @see https://fetch.spec.whatwg.org/#body-fully-read
1031
+ */
1032
+ async function fullyReadBody (body, processBody, processBodyError) {
1033
+ // 1. If taskDestination is null, then set taskDestination to
1034
+ // the result of starting a new parallel queue.
1035
+
1036
+ // 2. Let successSteps given a byte sequence bytes be to queue a
1037
+ // fetch task to run processBody given bytes, with taskDestination.
1038
+ const successSteps = processBody
1039
+
1040
+ // 3. Let errorSteps be to queue a fetch task to run processBodyError,
1041
+ // with taskDestination.
1042
+ const errorSteps = processBodyError
1043
+
1044
+ // 4. Let reader be the result of getting a reader for body’s stream.
1045
+ // If that threw an exception, then run errorSteps with that
1046
+ // exception and return.
1047
+ let reader
1048
+
1049
+ try {
1050
+ reader = body.stream.getReader()
1051
+ } catch (e) {
1052
+ errorSteps(e)
1053
+ return
1054
+ }
1055
+
1056
+ // 5. Read all bytes from reader, given successSteps and errorSteps.
1057
+ try {
1058
+ successSteps(await readAllBytes(reader))
1059
+ } catch (e) {
1060
+ errorSteps(e)
1061
+ }
1062
+ }
1063
+
1064
+ function isReadableStreamLike (stream) {
1065
+ return stream instanceof ReadableStream || (
1066
+ stream[Symbol.toStringTag] === 'ReadableStream' &&
1067
+ typeof stream.tee === 'function'
1068
+ )
1069
+ }
1070
+
1071
+ /**
1072
+ * @param {ReadableStreamController<Uint8Array>} controller
1073
+ */
1074
+ function readableStreamClose (controller) {
1075
+ try {
1076
+ controller.close()
1077
+ controller.byobRequest?.respond(0)
1078
+ } catch (err) {
1079
+ // TODO: add comment explaining why this error occurs.
1080
+ if (!err.message.includes('Controller is already closed') && !err.message.includes('ReadableStream is already closed')) {
1081
+ throw err
1082
+ }
1083
+ }
1084
+ }
1085
+
1086
+ const invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/ // eslint-disable-line
1087
+
1088
+ /**
1089
+ * @see https://infra.spec.whatwg.org/#isomorphic-encode
1090
+ * @param {string} input
1091
+ */
1092
+ function isomorphicEncode (input) {
1093
+ // 1. Assert: input contains no code points greater than U+00FF.
1094
+ assert(!invalidIsomorphicEncodeValueRegex.test(input))
1095
+
1096
+ // 2. Return a byte sequence whose length is equal to input’s code
1097
+ // point length and whose bytes have the same values as the
1098
+ // values of input’s code points, in the same order
1099
+ return input
1100
+ }
1101
+
1102
+ /**
1103
+ * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes
1104
+ * @see https://streams.spec.whatwg.org/#read-loop
1105
+ * @param {ReadableStreamDefaultReader} reader
1106
+ */
1107
+ async function readAllBytes (reader) {
1108
+ const bytes = []
1109
+ let byteLength = 0
1110
+
1111
+ while (true) {
1112
+ const { done, value: chunk } = await reader.read()
1113
+
1114
+ if (done) {
1115
+ // 1. Call successSteps with bytes.
1116
+ return Buffer.concat(bytes, byteLength)
1117
+ }
1118
+
1119
+ // 1. If chunk is not a Uint8Array object, call failureSteps
1120
+ // with a TypeError and abort these steps.
1121
+ if (!isUint8Array(chunk)) {
1122
+ throw new TypeError('Received non-Uint8Array chunk')
1123
+ }
1124
+
1125
+ // 2. Append the bytes represented by chunk to bytes.
1126
+ bytes.push(chunk)
1127
+ byteLength += chunk.length
1128
+
1129
+ // 3. Read-loop given reader, bytes, successSteps, and failureSteps.
1130
+ }
1131
+ }
1132
+
1133
+ /**
1134
+ * @see https://fetch.spec.whatwg.org/#is-local
1135
+ * @param {URL} url
1136
+ */
1137
+ function urlIsLocal (url) {
1138
+ assert('protocol' in url) // ensure it's a url object
1139
+
1140
+ const protocol = url.protocol
1141
+
1142
+ return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'
1143
+ }
1144
+
1145
+ /**
1146
+ * @param {string|URL} url
1147
+ * @returns {boolean}
1148
+ */
1149
+ function urlHasHttpsScheme (url) {
1150
+ return (
1151
+ (
1152
+ typeof url === 'string' &&
1153
+ url[5] === ':' &&
1154
+ url[0] === 'h' &&
1155
+ url[1] === 't' &&
1156
+ url[2] === 't' &&
1157
+ url[3] === 'p' &&
1158
+ url[4] === 's'
1159
+ ) ||
1160
+ url.protocol === 'https:'
1161
+ )
1162
+ }
1163
+
1164
+ /**
1165
+ * @see https://fetch.spec.whatwg.org/#http-scheme
1166
+ * @param {URL} url
1167
+ */
1168
+ function urlIsHttpHttpsScheme (url) {
1169
+ assert('protocol' in url) // ensure it's a url object
1170
+
1171
+ const protocol = url.protocol
1172
+
1173
+ return protocol === 'http:' || protocol === 'https:'
1174
+ }
1175
+
1176
+ /**
1177
+ * @see https://fetch.spec.whatwg.org/#simple-range-header-value
1178
+ * @param {string} value
1179
+ * @param {boolean} allowWhitespace
1180
+ */
1181
+ function simpleRangeHeaderValue (value, allowWhitespace) {
1182
+ // 1. Let data be the isomorphic decoding of value.
1183
+ // Note: isomorphic decoding takes a sequence of bytes (ie. a Uint8Array) and turns it into a string,
1184
+ // nothing more. We obviously don't need to do that if value is a string already.
1185
+ const data = value
1186
+
1187
+ // 2. If data does not start with "bytes", then return failure.
1188
+ if (!data.startsWith('bytes')) {
1189
+ return 'failure'
1190
+ }
1191
+
1192
+ // 3. Let position be a position variable for data, initially pointing at the 5th code point of data.
1193
+ const position = { position: 5 }
1194
+
1195
+ // 4. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,
1196
+ // from data given position.
1197
+ if (allowWhitespace) {
1198
+ collectASequenceOfCodePoints(
1199
+ (char) => char === '\t' || char === ' ',
1200
+ data,
1201
+ position
1202
+ )
1203
+ }
1204
+
1205
+ // 5. If the code point at position within data is not U+003D (=), then return failure.
1206
+ if (data.charCodeAt(position.position) !== 0x3D) {
1207
+ return 'failure'
1208
+ }
1209
+
1210
+ // 6. Advance position by 1.
1211
+ position.position++
1212
+
1213
+ // 7. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space, from
1214
+ // data given position.
1215
+ if (allowWhitespace) {
1216
+ collectASequenceOfCodePoints(
1217
+ (char) => char === '\t' || char === ' ',
1218
+ data,
1219
+ position
1220
+ )
1221
+ }
1222
+
1223
+ // 8. Let rangeStart be the result of collecting a sequence of code points that are ASCII digits,
1224
+ // from data given position.
1225
+ const rangeStart = collectASequenceOfCodePoints(
1226
+ (char) => {
1227
+ const code = char.charCodeAt(0)
1228
+
1229
+ return code >= 0x30 && code <= 0x39
1230
+ },
1231
+ data,
1232
+ position
1233
+ )
1234
+
1235
+ // 9. Let rangeStartValue be rangeStart, interpreted as decimal number, if rangeStart is not the
1236
+ // empty string; otherwise null.
1237
+ const rangeStartValue = rangeStart.length ? Number(rangeStart) : null
1238
+
1239
+ // 10. If allowWhitespace is true, collect a sequence of code points that are HTTP tab or space,
1240
+ // from data given position.
1241
+ if (allowWhitespace) {
1242
+ collectASequenceOfCodePoints(
1243
+ (char) => char === '\t' || char === ' ',
1244
+ data,
1245
+ position
1246
+ )
1247
+ }
1248
+
1249
+ // 11. If the code point at position within data is not U+002D (-), then return failure.
1250
+ if (data.charCodeAt(position.position) !== 0x2D) {
1251
+ return 'failure'
1252
+ }
1253
+
1254
+ // 12. Advance position by 1.
1255
+ position.position++
1256
+
1257
+ // 13. If allowWhitespace is true, collect a sequence of code points that are HTTP tab
1258
+ // or space, from data given position.
1259
+ // Note from Khafra: its the same step as in #8 again lol
1260
+ if (allowWhitespace) {
1261
+ collectASequenceOfCodePoints(
1262
+ (char) => char === '\t' || char === ' ',
1263
+ data,
1264
+ position
1265
+ )
1266
+ }
1267
+
1268
+ // 14. Let rangeEnd be the result of collecting a sequence of code points that are
1269
+ // ASCII digits, from data given position.
1270
+ // Note from Khafra: you wouldn't guess it, but this is also the same step as #8
1271
+ const rangeEnd = collectASequenceOfCodePoints(
1272
+ (char) => {
1273
+ const code = char.charCodeAt(0)
1274
+
1275
+ return code >= 0x30 && code <= 0x39
1276
+ },
1277
+ data,
1278
+ position
1279
+ )
1280
+
1281
+ // 15. Let rangeEndValue be rangeEnd, interpreted as decimal number, if rangeEnd
1282
+ // is not the empty string; otherwise null.
1283
+ // Note from Khafra: THE SAME STEP, AGAIN!!!
1284
+ // Note: why interpret as a decimal if we only collect ascii digits?
1285
+ const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null
1286
+
1287
+ // 16. If position is not past the end of data, then return failure.
1288
+ if (position.position < data.length) {
1289
+ return 'failure'
1290
+ }
1291
+
1292
+ // 17. If rangeEndValue and rangeStartValue are null, then return failure.
1293
+ if (rangeEndValue === null && rangeStartValue === null) {
1294
+ return 'failure'
1295
+ }
1296
+
1297
+ // 18. If rangeStartValue and rangeEndValue are numbers, and rangeStartValue is
1298
+ // greater than rangeEndValue, then return failure.
1299
+ // Note: ... when can they not be numbers?
1300
+ if (rangeStartValue > rangeEndValue) {
1301
+ return 'failure'
1302
+ }
1303
+
1304
+ // 19. Return (rangeStartValue, rangeEndValue).
1305
+ return { rangeStartValue, rangeEndValue }
1306
+ }
1307
+
1308
+ /**
1309
+ * @see https://fetch.spec.whatwg.org/#build-a-content-range
1310
+ * @param {number} rangeStart
1311
+ * @param {number} rangeEnd
1312
+ * @param {number} fullLength
1313
+ */
1314
+ function buildContentRange (rangeStart, rangeEnd, fullLength) {
1315
+ // 1. Let contentRange be `bytes `.
1316
+ let contentRange = 'bytes '
1317
+
1318
+ // 2. Append rangeStart, serialized and isomorphic encoded, to contentRange.
1319
+ contentRange += isomorphicEncode(`${rangeStart}`)
1320
+
1321
+ // 3. Append 0x2D (-) to contentRange.
1322
+ contentRange += '-'
1323
+
1324
+ // 4. Append rangeEnd, serialized and isomorphic encoded to contentRange.
1325
+ contentRange += isomorphicEncode(`${rangeEnd}`)
1326
+
1327
+ // 5. Append 0x2F (/) to contentRange.
1328
+ contentRange += '/'
1329
+
1330
+ // 6. Append fullLength, serialized and isomorphic encoded to contentRange.
1331
+ contentRange += isomorphicEncode(`${fullLength}`)
1332
+
1333
+ // 7. Return contentRange.
1334
+ return contentRange
1335
+ }
1336
+
1337
+ // A Stream, which pipes the response to zlib.createInflate() or
1338
+ // zlib.createInflateRaw() depending on the first byte of the Buffer.
1339
+ // If the lower byte of the first byte is 0x08, then the stream is
1340
+ // interpreted as a zlib stream, otherwise it's interpreted as a
1341
+ // raw deflate stream.
1342
+ class InflateStream extends Transform {
1343
+ #zlibOptions
1344
+
1345
+ /** @param {zlib.ZlibOptions} [zlibOptions] */
1346
+ constructor (zlibOptions) {
1347
+ super()
1348
+ this.#zlibOptions = zlibOptions
1349
+ }
1350
+
1351
+ _transform (chunk, encoding, callback) {
1352
+ if (!this._inflateStream) {
1353
+ if (chunk.length === 0) {
1354
+ callback()
1355
+ return
1356
+ }
1357
+ this._inflateStream = (chunk[0] & 0x0F) === 0x08
1358
+ ? zlib.createInflate(this.#zlibOptions)
1359
+ : zlib.createInflateRaw(this.#zlibOptions)
1360
+
1361
+ this._inflateStream.on('data', this.push.bind(this))
1362
+ this._inflateStream.on('end', () => this.push(null))
1363
+ this._inflateStream.on('error', (err) => this.destroy(err))
1364
+ }
1365
+
1366
+ this._inflateStream.write(chunk, encoding, callback)
1367
+ }
1368
+
1369
+ _final (callback) {
1370
+ if (this._inflateStream) {
1371
+ this._inflateStream.end()
1372
+ this._inflateStream = null
1373
+ }
1374
+ callback()
1375
+ }
1376
+ }
1377
+
1378
+ /**
1379
+ * @param {zlib.ZlibOptions} [zlibOptions]
1380
+ * @returns {InflateStream}
1381
+ */
1382
+ function createInflate (zlibOptions) {
1383
+ return new InflateStream(zlibOptions)
1384
+ }
1385
+
1386
+ /**
1387
+ * @see https://fetch.spec.whatwg.org/#concept-header-extract-mime-type
1388
+ * @param {import('./headers').HeadersList} headers
1389
+ */
1390
+ function extractMimeType (headers) {
1391
+ // 1. Let charset be null.
1392
+ let charset = null
1393
+
1394
+ // 2. Let essence be null.
1395
+ let essence = null
1396
+
1397
+ // 3. Let mimeType be null.
1398
+ let mimeType = null
1399
+
1400
+ // 4. Let values be the result of getting, decoding, and splitting `Content-Type` from headers.
1401
+ const values = getDecodeSplit('content-type', headers)
1402
+
1403
+ // 5. If values is null, then return failure.
1404
+ if (values === null) {
1405
+ return 'failure'
1406
+ }
1407
+
1408
+ // 6. For each value of values:
1409
+ for (const value of values) {
1410
+ // 6.1. Let temporaryMimeType be the result of parsing value.
1411
+ const temporaryMimeType = parseMIMEType(value)
1412
+
1413
+ // 6.2. If temporaryMimeType is failure or its essence is "*/*", then continue.
1414
+ if (temporaryMimeType === 'failure' || temporaryMimeType.essence === '*/*') {
1415
+ continue
1416
+ }
1417
+
1418
+ // 6.3. Set mimeType to temporaryMimeType.
1419
+ mimeType = temporaryMimeType
1420
+
1421
+ // 6.4. If mimeType’s essence is not essence, then:
1422
+ if (mimeType.essence !== essence) {
1423
+ // 6.4.1. Set charset to null.
1424
+ charset = null
1425
+
1426
+ // 6.4.2. If mimeType’s parameters["charset"] exists, then set charset to
1427
+ // mimeType’s parameters["charset"].
1428
+ if (mimeType.parameters.has('charset')) {
1429
+ charset = mimeType.parameters.get('charset')
1430
+ }
1431
+
1432
+ // 6.4.3. Set essence to mimeType’s essence.
1433
+ essence = mimeType.essence
1434
+ } else if (!mimeType.parameters.has('charset') && charset !== null) {
1435
+ // 6.5. Otherwise, if mimeType’s parameters["charset"] does not exist, and
1436
+ // charset is non-null, set mimeType’s parameters["charset"] to charset.
1437
+ mimeType.parameters.set('charset', charset)
1438
+ }
1439
+ }
1440
+
1441
+ // 7. If mimeType is null, then return failure.
1442
+ if (mimeType == null) {
1443
+ return 'failure'
1444
+ }
1445
+
1446
+ // 8. Return mimeType.
1447
+ return mimeType
1448
+ }
1449
+
1450
+ /**
1451
+ * @see https://fetch.spec.whatwg.org/#header-value-get-decode-and-split
1452
+ * @param {string|null} value
1453
+ */
1454
+ function gettingDecodingSplitting (value) {
1455
+ // 1. Let input be the result of isomorphic decoding value.
1456
+ const input = value
1457
+
1458
+ // 2. Let position be a position variable for input, initially pointing at the start of input.
1459
+ const position = { position: 0 }
1460
+
1461
+ // 3. Let values be a list of strings, initially empty.
1462
+ const values = []
1463
+
1464
+ // 4. Let temporaryValue be the empty string.
1465
+ let temporaryValue = ''
1466
+
1467
+ // 5. While position is not past the end of input:
1468
+ while (position.position < input.length) {
1469
+ // 5.1. Append the result of collecting a sequence of code points that are not U+0022 (")
1470
+ // or U+002C (,) from input, given position, to temporaryValue.
1471
+ temporaryValue += collectASequenceOfCodePoints(
1472
+ (char) => char !== '"' && char !== ',',
1473
+ input,
1474
+ position
1475
+ )
1476
+
1477
+ // 5.2. If position is not past the end of input, then:
1478
+ if (position.position < input.length) {
1479
+ // 5.2.1. If the code point at position within input is U+0022 ("), then:
1480
+ if (input.charCodeAt(position.position) === 0x22) {
1481
+ // 5.2.1.1. Append the result of collecting an HTTP quoted string from input, given position, to temporaryValue.
1482
+ temporaryValue += collectAnHTTPQuotedString(
1483
+ input,
1484
+ position
1485
+ )
1486
+
1487
+ // 5.2.1.2. If position is not past the end of input, then continue.
1488
+ if (position.position < input.length) {
1489
+ continue
1490
+ }
1491
+ } else {
1492
+ // 5.2.2. Otherwise:
1493
+
1494
+ // 5.2.2.1. Assert: the code point at position within input is U+002C (,).
1495
+ assert(input.charCodeAt(position.position) === 0x2C)
1496
+
1497
+ // 5.2.2.2. Advance position by 1.
1498
+ position.position++
1499
+ }
1500
+ }
1501
+
1502
+ // 5.3. Remove all HTTP tab or space from the start and end of temporaryValue.
1503
+ temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 0x9 || char === 0x20)
1504
+
1505
+ // 5.4. Append temporaryValue to values.
1506
+ values.push(temporaryValue)
1507
+
1508
+ // 5.6. Set temporaryValue to the empty string.
1509
+ temporaryValue = ''
1510
+ }
1511
+
1512
+ // 6. Return values.
1513
+ return values
1514
+ }
1515
+
1516
+ /**
1517
+ * @see https://fetch.spec.whatwg.org/#concept-header-list-get-decode-split
1518
+ * @param {string} name lowercase header name
1519
+ * @param {import('./headers').HeadersList} list
1520
+ */
1521
+ function getDecodeSplit (name, list) {
1522
+ // 1. Let value be the result of getting name from list.
1523
+ const value = list.get(name, true)
1524
+
1525
+ // 2. If value is null, then return null.
1526
+ if (value === null) {
1527
+ return null
1528
+ }
1529
+
1530
+ // 3. Return the result of getting, decoding, and splitting value.
1531
+ return gettingDecodingSplitting(value)
1532
+ }
1533
+
1534
+ const textDecoder = new TextDecoder()
1535
+
1536
+ /**
1537
+ * @see https://encoding.spec.whatwg.org/#utf-8-decode
1538
+ * @param {Buffer} buffer
1539
+ */
1540
+ function utf8DecodeBytes (buffer) {
1541
+ if (buffer.length === 0) {
1542
+ return ''
1543
+ }
1544
+
1545
+ // 1. Let buffer be the result of peeking three bytes from
1546
+ // ioQueue, converted to a byte sequence.
1547
+
1548
+ // 2. If buffer is 0xEF 0xBB 0xBF, then read three
1549
+ // bytes from ioQueue. (Do nothing with those bytes.)
1550
+ if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
1551
+ buffer = buffer.subarray(3)
1552
+ }
1553
+
1554
+ // 3. Process a queue with an instance of UTF-8’s
1555
+ // decoder, ioQueue, output, and "replacement".
1556
+ const output = textDecoder.decode(buffer)
1557
+
1558
+ // 4. Return output.
1559
+ return output
1560
+ }
1561
+
1562
+ class EnvironmentSettingsObjectBase {
1563
+ get baseUrl () {
1564
+ return getGlobalOrigin()
1565
+ }
1566
+
1567
+ get origin () {
1568
+ return this.baseUrl?.origin
1569
+ }
1570
+
1571
+ policyContainer = makePolicyContainer()
1572
+ }
1573
+
1574
+ class EnvironmentSettingsObject {
1575
+ settingsObject = new EnvironmentSettingsObjectBase()
1576
+ }
1577
+
1578
+ const environmentSettingsObject = new EnvironmentSettingsObject()
1579
+
1580
+ module.exports = {
1581
+ isAborted,
1582
+ isCancelled,
1583
+ isValidEncodedURL,
1584
+ createDeferredPromise,
1585
+ ReadableStreamFrom,
1586
+ tryUpgradeRequestToAPotentiallyTrustworthyURL,
1587
+ clampAndCoarsenConnectionTimingInfo,
1588
+ coarsenedSharedCurrentTime,
1589
+ determineRequestsReferrer,
1590
+ makePolicyContainer,
1591
+ clonePolicyContainer,
1592
+ appendFetchMetadata,
1593
+ appendRequestOriginHeader,
1594
+ TAOCheck,
1595
+ corsCheck,
1596
+ crossOriginResourcePolicyCheck,
1597
+ createOpaqueTimingInfo,
1598
+ setRequestReferrerPolicyOnRedirect,
1599
+ isValidHTTPToken,
1600
+ requestBadPort,
1601
+ requestCurrentURL,
1602
+ responseURL,
1603
+ responseLocationURL,
1604
+ isBlobLike,
1605
+ isURLPotentiallyTrustworthy,
1606
+ isValidReasonPhrase,
1607
+ sameOrigin,
1608
+ normalizeMethod,
1609
+ serializeJavascriptValueToJSONString,
1610
+ iteratorMixin,
1611
+ createIterator,
1612
+ isValidHeaderName,
1613
+ isValidHeaderValue,
1614
+ isErrorLike,
1615
+ fullyReadBody,
1616
+ bytesMatch,
1617
+ isReadableStreamLike,
1618
+ readableStreamClose,
1619
+ isomorphicEncode,
1620
+ urlIsLocal,
1621
+ urlHasHttpsScheme,
1622
+ urlIsHttpHttpsScheme,
1623
+ readAllBytes,
1624
+ simpleRangeHeaderValue,
1625
+ buildContentRange,
1626
+ parseMetadata,
1627
+ createInflate,
1628
+ extractMimeType,
1629
+ getDecodeSplit,
1630
+ utf8DecodeBytes,
1631
+ environmentSettingsObject
1632
+ }