@openclaw/slack 2026.9.6 → 2026.9.7

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 (291) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{account-inspect-DP1Bcwj4.mjs → account-inspect-DWBXpER6.mjs} +1 -1
  3. package/dist/.setup/{accounts-BBHvg0pY.mjs → accounts-D_N9IqNA.mjs} +23 -1
  4. package/dist/.setup/{action-runtime-B01d85zt.mjs → action-runtime-DfWvuiZd.mjs} +26 -41
  5. package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +2 -0
  6. package/dist/.setup/{actions-DKCtBgCI.mjs → actions-Df0CzcDl.mjs} +88 -175
  7. package/dist/.setup/{approval-handler.runtime-DMszKn_7.mjs → approval-handler.runtime-Ed6Sw5VK.mjs} +37 -47
  8. package/dist/.setup/{approval-message-updates-Tb_qRokK.mjs → approval-message-updates-BadvtA7R.mjs} +1 -2
  9. package/dist/.setup/{channel-CErYZ5zw.mjs → channel-C7bgPSTE.mjs} +181 -273
  10. package/dist/.setup/channel-meta-C443t-lI.mjs +27 -0
  11. package/dist/.setup/{channel-type-Dxk8VJUb.mjs → channel-type-ClOttrZ5.mjs} +13 -21
  12. package/dist/.setup/{channel.setup-BVoUtdPn.mjs → channel.setup-Dh2jzAjN.mjs} +35 -42
  13. package/dist/.setup/{config-schema-CyL279e7.mjs → config-schema-BZCxmHKG.mjs} +24 -21
  14. package/dist/.setup/{directory-config-CQTSH45W.mjs → directory-config-BOUWH3hR.mjs} +7 -10
  15. package/dist/.setup/{directory-live-BCcj89QV.mjs → directory-live-B2O4B_Ho.mjs} +9 -21
  16. package/dist/.setup/doctor-contract-CRN1Z_c7.mjs +342 -0
  17. package/dist/.setup/{message-tool-api-C0PTFaNV.mjs → message-tool-api-Cu4lwlGy.mjs} +34 -48
  18. package/dist/.setup/{provider-C-jPaGt2.mjs → monitor-BPVfkumU.mjs} +2181 -2693
  19. package/dist/.setup/{outbound-adapter-A7Wdn8ZT.mjs → outbound-adapter-Bv48XUjq.mjs} +10 -21
  20. package/dist/.setup/{pipeline.runtime-BlPOexmJ.mjs → pipeline.runtime-B1H63Frf.mjs} +311 -457
  21. package/dist/.setup/{plugin-routes-C3X0eVaK.mjs → plugin-routes-B8tooDLj.mjs} +1 -1
  22. package/dist/.setup/{policy-BApW53pI.mjs → policy-D-jfM174.mjs} +5 -5
  23. package/dist/.setup/{probe-DiYIMPJo.mjs → probe-B2Y9qc_z.mjs} +101 -39
  24. package/dist/.setup/{registry-bbjH7IHX.mjs → registry-CIbMfuf8.mjs} +6 -2
  25. package/dist/.setup/{relay-source-DfOnjJTE.mjs → relay-source-BpKdjsll.mjs} +10 -12
  26. package/dist/.setup/{replies-BBAJxUOQ.mjs → replies-BAnUtr2f.mjs} +16 -76
  27. package/dist/.setup/{reply-blocks-Bm8kf6mK.mjs → reply-blocks-SE1kTE3I.mjs} +27 -154
  28. package/dist/.setup/{resolve-channels-BXbMBbJD.mjs → resolve-channels-XXBn8UU_.mjs} +4 -5
  29. package/dist/.setup/{resolve-users-65WqvIqD.mjs → resolve-users-DW0ngD03.mjs} +20 -22
  30. package/dist/.setup/{scopes-h3YB-mMs.mjs → scopes-CasuDvaa.mjs} +6 -17
  31. package/dist/.setup/{secret-contract-DxmvbxBF.mjs → secret-contract-BaZcu6P_.mjs} +15 -20
  32. package/dist/.setup/{secret-contract-api-D9UfYujm.mjs → secret-contract-api-Dp6290Vg.mjs} +1 -1
  33. package/dist/.setup/{security-audit-BypHqcq5.mjs → security-audit-BqDc-6VL.mjs} +1 -1
  34. package/dist/.setup/{send-Cp6omkOg.mjs → send-BOVLQi3n.mjs} +84 -171
  35. package/dist/.setup/{session-status-Cf7AvWOt.mjs → session-status-DscajIsd.mjs} +315 -238
  36. package/dist/.setup/{setup-plugin-api-dLPkL06L.mjs → setup-plugin-api-DTtbTKNk.mjs} +1 -1
  37. package/dist/.setup/{setup-surface-D3DLcCxu.mjs → setup-surface-Dn7QgWRE.mjs} +24 -56
  38. package/dist/.setup/{shared-CJ3arAFL.mjs → shared-qau-uDGl.mjs} +30 -56
  39. package/dist/.setup/{slash-dispatch.runtime-HFy_XvyO.mjs → slash-dispatch.runtime--AEzLVBF.mjs} +1 -1
  40. package/dist/.setup/{streaming-compat-B-e0mqM0.mjs → streaming-compat-C5Wut626.mjs} +31 -8
  41. package/dist/.setup/{target-parsing-DEsPjngB.mjs → target-parsing-FFE26kOV.mjs} +1 -7
  42. package/dist/.setup/{targets-Cku2KCvg.mjs → targets-C6LZQL1Q.mjs} +1 -1
  43. package/dist/.setup/{thread-ts-CukseRVL.mjs → thread-ts-Cvt7WD6B.mjs} +0 -1
  44. package/dist/account-inspect-api.js +1 -1
  45. package/dist/api.js +18 -17
  46. package/dist/channel-config-api.js +1 -1
  47. package/dist/channel-plugin-api.js +1 -1
  48. package/dist/directory-contract-api.js +1 -1
  49. package/dist/doctor-contract-api.js +1 -1
  50. package/dist/http-routes-api.js +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/message-tool-api.js +1 -1
  53. package/dist/runtime-api.js +11 -12
  54. package/dist/secret-contract-api.js +1 -1
  55. package/dist/security-contract-api.js +1 -1
  56. package/dist/setup-entry.js +2 -2
  57. package/dist/setup-plugin-api.js +1 -1
  58. package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
  59. package/node_modules/@slack/bolt/node_modules/@types/node/child_process.d.ts +1 -1
  60. package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +20 -8
  61. package/node_modules/@slack/bolt/node_modules/@types/node/ffi.d.ts +14 -0
  62. package/node_modules/@slack/bolt/node_modules/@types/node/http2.d.ts +3 -2
  63. package/node_modules/@slack/bolt/node_modules/@types/node/net.d.ts +16 -4
  64. package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
  65. package/node_modules/@slack/bolt/node_modules/@types/node/process.d.ts +1 -0
  66. package/node_modules/@slack/bolt/node_modules/@types/node/quic.d.ts +39 -1
  67. package/node_modules/@slack/bolt/node_modules/@types/node/stream/iter.d.ts +9 -12
  68. package/node_modules/@slack/bolt/node_modules/@types/node/test/reporters.d.ts +1 -0
  69. package/node_modules/@slack/bolt/node_modules/@types/node/test.d.ts +72 -0
  70. package/node_modules/@slack/bolt/node_modules/@types/node/tls.d.ts +14 -10
  71. package/node_modules/@slack/bolt/node_modules/@types/node/vm.d.ts +2 -1
  72. package/node_modules/@slack/bolt/node_modules/@types/node/worker_threads.d.ts +4 -1
  73. package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
  74. package/node_modules/@slack/web-api/node_modules/@types/node/child_process.d.ts +1 -1
  75. package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +20 -8
  76. package/node_modules/@slack/web-api/node_modules/@types/node/ffi.d.ts +14 -0
  77. package/node_modules/@slack/web-api/node_modules/@types/node/http2.d.ts +3 -2
  78. package/node_modules/@slack/web-api/node_modules/@types/node/net.d.ts +16 -4
  79. package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
  80. package/node_modules/@slack/web-api/node_modules/@types/node/process.d.ts +1 -0
  81. package/node_modules/@slack/web-api/node_modules/@types/node/quic.d.ts +39 -1
  82. package/node_modules/@slack/web-api/node_modules/@types/node/stream/iter.d.ts +9 -12
  83. package/node_modules/@slack/web-api/node_modules/@types/node/test/reporters.d.ts +1 -0
  84. package/node_modules/@slack/web-api/node_modules/@types/node/test.d.ts +72 -0
  85. package/node_modules/@slack/web-api/node_modules/@types/node/tls.d.ts +14 -10
  86. package/node_modules/@slack/web-api/node_modules/@types/node/vm.d.ts +2 -1
  87. package/node_modules/@slack/web-api/node_modules/@types/node/worker_threads.d.ts +4 -1
  88. package/node_modules/get-east-asian-width/index.js +8 -3
  89. package/node_modules/get-east-asian-width/lookup-data.js +1 -1
  90. package/node_modules/get-east-asian-width/lookup.js +4 -4
  91. package/node_modules/get-east-asian-width/package.json +1 -1
  92. package/node_modules/typebox/build/compile/code.mjs +1 -2
  93. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  94. package/node_modules/typebox/build/format/iri.mjs +16 -9
  95. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  96. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  97. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  98. package/node_modules/typebox/build/guard/index.mjs +6 -0
  99. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  100. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  101. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  102. package/node_modules/typebox/build/schema/build.mjs +2 -3
  103. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  104. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  105. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  106. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  107. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  108. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  109. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  110. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  111. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  112. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  113. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  114. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  115. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  116. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  117. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  118. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  119. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  120. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  121. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  122. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  123. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  124. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  125. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  126. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  127. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  128. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  129. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  130. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  131. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  132. package/node_modules/typebox/package.json +1 -1
  133. package/node_modules/typebox/readme.md +3 -1
  134. package/node_modules/undici/README.md +81 -25
  135. package/node_modules/undici/docs/docs/api/Agent.md +249 -42
  136. package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
  137. package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
  138. package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
  139. package/node_modules/undici/docs/docs/api/Client.md +407 -162
  140. package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
  141. package/node_modules/undici/docs/docs/api/Connector.md +118 -35
  142. package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
  143. package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
  144. package/node_modules/undici/docs/docs/api/Debug.md +34 -18
  145. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
  146. package/node_modules/undici/docs/docs/api/Dispatcher.md +490 -1055
  147. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +105 -93
  148. package/node_modules/undici/docs/docs/api/Errors.md +503 -28
  149. package/node_modules/undici/docs/docs/api/EventSource.md +326 -13
  150. package/node_modules/undici/docs/docs/api/Fetch.md +681 -30
  151. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -96
  152. package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
  153. package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
  154. package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
  155. package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
  156. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
  157. package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
  158. package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
  159. package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
  160. package/node_modules/undici/docs/docs/api/Pool.md +236 -41
  161. package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
  162. package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
  163. package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -55
  164. package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -27
  165. package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -79
  166. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
  167. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +262 -517
  168. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
  169. package/node_modules/undici/docs/docs/api/Util.md +68 -11
  170. package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
  171. package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
  172. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
  173. package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
  174. package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
  175. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
  176. package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
  177. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
  178. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
  179. package/node_modules/undici/docs/docs/getting-started.md +281 -0
  180. package/node_modules/undici/docs/docs/index.md +784 -0
  181. package/node_modules/undici/docs/docs/site.json +125 -0
  182. package/node_modules/undici/docs/docs/type-map.json +79 -0
  183. package/node_modules/undici/index.js +4 -2
  184. package/node_modules/undici/lib/api/api-connect.js +13 -11
  185. package/node_modules/undici/lib/api/api-pipeline.js +26 -13
  186. package/node_modules/undici/lib/api/api-request.js +51 -21
  187. package/node_modules/undici/lib/api/api-stream.js +81 -20
  188. package/node_modules/undici/lib/api/api-upgrade.js +21 -11
  189. package/node_modules/undici/lib/api/readable.js +45 -9
  190. package/node_modules/undici/lib/cache/memory-cache-store.js +3 -3
  191. package/node_modules/undici/lib/cache/sqlite-cache-store.js +3 -1
  192. package/node_modules/undici/lib/core/connect.js +46 -7
  193. package/node_modules/undici/lib/core/constants.js +1 -24
  194. package/node_modules/undici/lib/core/errors.js +22 -2
  195. package/node_modules/undici/lib/core/request.js +100 -18
  196. package/node_modules/undici/lib/core/symbols.js +4 -0
  197. package/node_modules/undici/lib/core/util.js +105 -48
  198. package/node_modules/undici/lib/dispatcher/agent.js +51 -32
  199. package/node_modules/undici/lib/dispatcher/balanced-pool.js +23 -27
  200. package/node_modules/undici/lib/dispatcher/client-h1.js +86 -24
  201. package/node_modules/undici/lib/dispatcher/client-h2.js +1091 -361
  202. package/node_modules/undici/lib/dispatcher/client.js +109 -36
  203. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +19 -6
  204. package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -5
  205. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +110 -0
  206. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
  207. package/node_modules/undici/lib/dispatcher/h2c-client.js +4 -4
  208. package/node_modules/undici/lib/dispatcher/pool-base.js +28 -10
  209. package/node_modules/undici/lib/dispatcher/pool.js +30 -5
  210. package/node_modules/undici/lib/dispatcher/proxy-agent.js +95 -19
  211. package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
  212. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +32 -10
  213. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +153 -63
  214. package/node_modules/undici/lib/global.js +37 -14
  215. package/node_modules/undici/lib/handler/cache-handler.js +49 -7
  216. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  217. package/node_modules/undici/lib/handler/decorator-handler.js +8 -3
  218. package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
  219. package/node_modules/undici/lib/handler/redirect-handler.js +66 -66
  220. package/node_modules/undici/lib/handler/retry-handler.js +191 -50
  221. package/node_modules/undici/lib/interceptor/cache.js +75 -25
  222. package/node_modules/undici/lib/interceptor/decompress.js +5 -2
  223. package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
  224. package/node_modules/undici/lib/interceptor/dns.js +12 -1
  225. package/node_modules/undici/lib/interceptor/redirect.js +3 -3
  226. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -1
  227. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -1
  228. package/node_modules/undici/lib/mock/mock-agent.js +21 -9
  229. package/node_modules/undici/lib/mock/mock-call-history.js +1 -1
  230. package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  231. package/node_modules/undici/lib/mock/mock-utils.js +281 -47
  232. package/node_modules/undici/lib/mock/snapshot-agent.js +25 -7
  233. package/node_modules/undici/lib/mock/snapshot-recorder.js +38 -3
  234. package/node_modules/undici/lib/util/cache.js +92 -10
  235. package/node_modules/undici/lib/util/runtime-features.js +3 -34
  236. package/node_modules/undici/lib/web/cache/cache.js +6 -8
  237. package/node_modules/undici/lib/web/cookies/parse.js +150 -146
  238. package/node_modules/undici/lib/web/cookies/util.js +1 -1
  239. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
  240. package/node_modules/undici/lib/web/eventsource/eventsource.js +20 -21
  241. package/node_modules/undici/lib/web/eventsource/util.js +32 -1
  242. package/node_modules/undici/lib/web/fetch/body.js +48 -10
  243. package/node_modules/undici/lib/web/fetch/constants.js +1 -1
  244. package/node_modules/undici/lib/web/fetch/formdata.js +21 -2
  245. package/node_modules/undici/lib/web/fetch/index.js +242 -223
  246. package/node_modules/undici/lib/web/fetch/request.js +35 -6
  247. package/node_modules/undici/lib/web/fetch/response.js +1 -3
  248. package/node_modules/undici/lib/web/fetch/util.js +10 -2
  249. package/node_modules/undici/lib/web/webidl/index.js +5 -7
  250. package/node_modules/undici/lib/web/websocket/frame.js +1 -7
  251. package/node_modules/undici/lib/web/websocket/receiver.js +1 -1
  252. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +10 -10
  253. package/node_modules/undici/lib/web/websocket/websocket.js +25 -3
  254. package/node_modules/undici/package.json +10 -10
  255. package/node_modules/undici/types/agent.d.ts +0 -2
  256. package/node_modules/undici/types/client.d.ts +69 -24
  257. package/node_modules/undici/types/connector.d.ts +1 -0
  258. package/node_modules/undici/types/cookies.d.ts +1 -1
  259. package/node_modules/undici/types/dispatcher.d.ts +8 -30
  260. package/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
  261. package/node_modules/undici/types/errors.d.ts +10 -0
  262. package/node_modules/undici/types/fetch.d.ts +5 -1
  263. package/node_modules/undici/types/formdata.d.ts +0 -6
  264. package/node_modules/undici/types/h2c-client.d.ts +6 -6
  265. package/node_modules/undici/types/handlers.d.ts +2 -0
  266. package/node_modules/undici/types/header.d.ts +5 -0
  267. package/node_modules/undici/types/index.d.ts +3 -1
  268. package/node_modules/undici/types/interceptors.d.ts +1 -1
  269. package/node_modules/undici/types/mock-agent.d.ts +11 -10
  270. package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  271. package/node_modules/undici/types/pool.d.ts +0 -2
  272. package/node_modules/undici/types/proxy-agent.d.ts +9 -2
  273. package/node_modules/undici/types/round-robin-pool.d.ts +0 -2
  274. package/node_modules/undici/types/snapshot-agent.d.ts +4 -0
  275. package/node_modules/undici/types/socks5-proxy-agent.d.ts +4 -2
  276. package/node_modules/undici/types/webidl.d.ts +0 -1
  277. package/openclaw.plugin.json +31 -3
  278. package/package.json +7 -7
  279. package/dist/.setup/accounts.runtime-DN-PPocC.mjs +0 -2
  280. package/dist/.setup/action-runtime.runtime-C8R8CUan.mjs +0 -2
  281. package/dist/.setup/doctor-contract-CtMUqjvk.mjs +0 -186
  282. package/dist/.setup/monitor-_Sht7Dqy.mjs +0 -13
  283. package/dist/.setup/rolldown-runtime-D7D4PA-g.mjs +0 -13
  284. package/dist/.setup/send.runtime-B4caZU6T.mjs +0 -2
  285. package/dist/.setup/slash-commands.runtime-BpSH0b3q.mjs +0 -2
  286. package/dist/.setup/slash-skill-commands.runtime-Bi1JWZHY.mjs +0 -2
  287. package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
  288. package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
  289. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  290. package/node_modules/undici/lib/util/promise.js +0 -28
  291. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -52,10 +52,9 @@ const {
52
52
  kOnError,
53
53
  kHTTPContext,
54
54
  kMaxConcurrentStreams,
55
- kHTTP2InitialWindowSize,
56
- kHTTP2ConnectionWindowSize,
55
+ kHostAuthority,
57
56
  kResume,
58
- kPingInterval
57
+ kHTTP2Options
59
58
  } = require('../core/symbols.js')
60
59
  const connectH1 = require('./client-h1.js')
61
60
  const connectH2 = require('./client-h2.js')
@@ -75,6 +74,28 @@ function getPipelining (client) {
75
74
  return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1
76
75
  }
77
76
 
77
+ let h2NamespaceOptsWarning = false
78
+ function emitH2OptionsNamespaceWarning (optName) {
79
+ if (h2NamespaceOptsWarning === true) return
80
+
81
+ process.emitWarning(`Use h2Options.${optName} instead. ${optName} for H2 will be deprecated in future major.`, {
82
+ code: 'UNDICI-H2-OPTIONS'
83
+ })
84
+ h2NamespaceOptsWarning = true
85
+ }
86
+
87
+ // Protocol-aware dispatch ceiling. h1 RFC7230 pipelining is unrelated to h2
88
+ // stream multiplexing — over h2 the ceiling is the (server-confirmed)
89
+ // maxConcurrentStreams. Before a context is attached we use the h1
90
+ // pipelining factor; once h2 attaches the queued requests can drain in
91
+ // one batch up to maxConcurrentStreams.
92
+ function getMaxConcurrent (client) {
93
+ if (client[kHTTPContext]?.version === 'h2') {
94
+ return client[kMaxConcurrentStreams]
95
+ }
96
+ return getPipelining(client)
97
+ }
98
+
78
99
  /**
79
100
  * @type {import('../../types/client.js').default}
80
101
  */
@@ -115,7 +136,9 @@ class Client extends DispatcherBase {
115
136
  initialWindowSize,
116
137
  connectionWindowSize,
117
138
  pingInterval,
118
- webSocket
139
+ webSocket,
140
+ h2Options,
141
+ eventSource
119
142
  } = {}) {
120
143
  if (keepAlive !== undefined) {
121
144
  throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')
@@ -203,35 +226,66 @@ class Client extends DispatcherBase {
203
226
  throw new InvalidArgumentError('allowH2 must be a valid boolean value')
204
227
  }
205
228
 
206
- if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {
207
- throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')
208
- }
229
+ // We validate only if allowH2 is enabled or null (enabled by default)
230
+ if (allowH2 !== false) {
231
+ // Prioritise new h2Options object, otherwise fallback to prior configuration options
232
+ if (h2Options != null) {
233
+ if (h2Options.useH2c != null && typeof h2Options.useH2c !== 'boolean') {
234
+ throw new InvalidArgumentError('h2Options.useH2c must be a valid boolean value')
235
+ }
209
236
 
210
- if (useH2c != null && typeof useH2c !== 'boolean') {
211
- throw new InvalidArgumentError('useH2c must be a valid boolean value')
212
- }
237
+ if (h2Options.settings?.initialWindowSize != null && (!Number.isInteger(h2Options.settings.initialWindowSize) || h2Options.settings.initialWindowSize < 1)) {
238
+ throw new InvalidArgumentError('h2Options.settings.initialWindowSize must be a positive integer, greater than 0')
239
+ }
213
240
 
214
- if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {
215
- throw new InvalidArgumentError('initialWindowSize must be a positive integer, greater than 0')
216
- }
241
+ if (h2Options.maxConcurrentStreams != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.maxConcurrentStreams < 1)) {
242
+ throw new InvalidArgumentError('h2Options.maxConcurrentStreams must be a positive integer, greater than 0')
243
+ }
217
244
 
218
- if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {
219
- throw new InvalidArgumentError('connectionWindowSize must be a positive integer, greater than 0')
220
- }
245
+ if (h2Options.connectionWindowSize != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.connectionWindowSize < 1)) {
246
+ throw new InvalidArgumentError('h2Options.connectionWindowSize must be a positive integer, greater than 0')
247
+ }
221
248
 
222
- if (pingInterval != null && (typeof pingInterval !== 'number' || !Number.isInteger(pingInterval) || pingInterval < 0)) {
223
- throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')
249
+ if (h2Options.pingInterval != null && (typeof h2Options.pingInterval !== 'number' || !Number.isInteger(h2Options.pingInterval) || h2Options.pingInterval < 0)) {
250
+ throw new InvalidArgumentError('h2Options.pingInterval must be a positive integer, greater or equal to 0')
251
+ }
252
+ } else {
253
+ if (useH2c != null && typeof useH2c !== 'boolean') {
254
+ emitH2OptionsNamespaceWarning('useH2c')
255
+ throw new InvalidArgumentError('useH2c must be a valid boolean value')
256
+ }
257
+
258
+ if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {
259
+ emitH2OptionsNamespaceWarning('maxConcurrentStreams')
260
+ throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')
261
+ }
262
+
263
+ if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {
264
+ emitH2OptionsNamespaceWarning('initialWindowSize')
265
+ throw new InvalidArgumentError('initialWindowSize must be a positive integer, greater than 0')
266
+ }
267
+
268
+ if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {
269
+ emitH2OptionsNamespaceWarning('connectionWindowSize')
270
+ throw new InvalidArgumentError('connectionWindowSize must be a positive integer, greater than 0')
271
+ }
272
+
273
+ if (pingInterval != null && (typeof pingInterval !== 'number' || !Number.isInteger(pingInterval) || pingInterval < 0)) {
274
+ emitH2OptionsNamespaceWarning('pingInterval')
275
+ throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')
276
+ }
277
+ }
224
278
  }
225
279
 
226
- super({ webSocket })
280
+ super({ webSocket, eventSource })
227
281
 
228
282
  if (typeof connect !== 'function') {
229
283
  connect = buildConnector({
230
284
  ...tls,
231
285
  maxCachedSessions,
232
286
  allowH2,
233
- useH2c,
234
287
  socketPath,
288
+ useH2c: h2Options?.useH2c ?? useH2c,
235
289
  timeout: connectTimeout,
236
290
  ...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
237
291
  ...connect
@@ -246,6 +300,7 @@ class Client extends DispatcherBase {
246
300
  }
247
301
 
248
302
  this[kUrl] = util.parseOrigin(url)
303
+ this[kHostAuthority] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}`
249
304
  this[kConnector] = connect
250
305
  this[kPipelining] = pipelining != null ? pipelining : 1
251
306
  this[kMaxHeadersSize] = maxHeaderSize
@@ -257,7 +312,7 @@ class Client extends DispatcherBase {
257
312
  this[kLocalAddress] = localAddress != null ? localAddress : null
258
313
  this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming
259
314
  this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming
260
- this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`
315
+ this[kHostHeader] = `host: ${this[kHostAuthority]}\r\n`
261
316
  this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3
262
317
  this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3
263
318
  this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength
@@ -266,16 +321,20 @@ class Client extends DispatcherBase {
266
321
  this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1
267
322
  this[kHTTPContext] = null
268
323
  // h2
269
- this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server
270
- // HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:
271
- // - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)
272
- // Allows more data to be sent before requiring acknowledgment, improving throughput
273
- // especially on high-latency networks. This matches common production HTTP/2 servers.
274
- // - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)
275
- // Provides better flow control for the entire connection across multiple streams.
276
- this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144
277
- this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288
278
- this[kPingInterval] = pingInterval != null ? pingInterval : 60e3 // Default ping interval for h2 - 1 minute
324
+ this[kHTTP2Options] = {
325
+ pingInterval: h2Options?.pingInterval ?? pingInterval ?? 60e3,
326
+ connectionWindowSize: h2Options?.connectionWindowSize ?? connectionWindowSize ?? 524288,
327
+ maxConcurrentStreams: h2Options?.maxConcurrentStreams ?? maxConcurrentStreams ?? 100, // Max peerConcurrentStreams for a Node h2 server
328
+ sessionOptions: {
329
+ // HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:
330
+ // - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)
331
+ // Allows more data to be sent before requiring acknowledgment, improving throughput
332
+ // especially on high-latency networks. This matches common production HTTP/2 servers.
333
+ // - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)
334
+ // Provides better flow control for the entire connection across multiple streams.
335
+ initialWindowSize: h2Options?.initialWindowSize ?? initialWindowSize ?? 262144
336
+ }
337
+ }
279
338
 
280
339
  // kQueue is built up of 3 sections separated by
281
340
  // the kRunningIdx and kPendingIdx indices.
@@ -324,10 +383,17 @@ class Client extends DispatcherBase {
324
383
  }
325
384
 
326
385
  get [kBusy] () {
386
+ // The `kPending > 0` check below is the gate Pool uses to decide whether
387
+ // to spin up an additional Client. For h1 that fan-out is correct —
388
+ // each socket only handles one pipelined request at a time. Once an h2
389
+ // context is attached we want concurrent dispatches to multiplex onto
390
+ // the shared session, so suppress that signal in the h2 case.
391
+ const allowsMux = this[kHTTPContext]?.version === 'h2'
392
+
327
393
  return Boolean(
328
394
  this[kHTTPContext]?.busy(null) ||
329
- (this[kSize] >= (getPipelining(this) || 1)) ||
330
- this[kPending] > 0
395
+ (this[kSize] >= (getMaxConcurrent(this) || 1)) ||
396
+ (this[kPending] > 0 && !allowsMux)
331
397
  )
332
398
  }
333
399
 
@@ -551,9 +617,15 @@ function handleConnectError (client, err, { host, hostname, protocol, port }) {
551
617
  }
552
618
 
553
619
  if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
554
- assert(client[kRunning] === 0)
620
+ const running = client[kQueue].splice(client[kRunningIdx], client[kRunning])
621
+ client[kPendingIdx] = client[kRunningIdx]
622
+
623
+ for (let i = 0; i < running.length; i++) {
624
+ util.errorRequest(client, running[i], err)
625
+ }
626
+
555
627
  while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
556
- const request = client[kQueue][client[kPendingIdx]++]
628
+ const request = client[kQueue].splice(client[kPendingIdx], 1)[0]
557
629
  util.errorRequest(client, request, err)
558
630
  }
559
631
  } else {
@@ -618,7 +690,7 @@ function _resume (client, sync) {
618
690
  return
619
691
  }
620
692
 
621
- if (client[kRunning] >= (getPipelining(client) || 1)) {
693
+ if (client[kRunning] >= (getMaxConcurrent(client) || 1)) {
622
694
  return
623
695
  }
624
696
 
@@ -645,6 +717,7 @@ function _resume (client, sync) {
645
717
  }
646
718
 
647
719
  if (!client[kHTTPContext]) {
720
+ client[kServerName] = request.servername
648
721
  connect(client)
649
722
  return
650
723
  }
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ const buffer = require('node:buffer')
3
4
  const Dispatcher = require('./dispatcher')
4
- const UnwrapHandler = require('../handler/unwrap-handler')
5
5
  const {
6
6
  ClientDestroyedError,
7
7
  ClientClosedError,
@@ -12,6 +12,7 @@ const { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require('../core/sy
12
12
  const kOnDestroyed = Symbol('onDestroyed')
13
13
  const kOnClosed = Symbol('onClosed')
14
14
  const kWebSocketOptions = Symbol('webSocketOptions')
15
+ const kEventSourceOptions = Symbol('eventSourceOptions')
15
16
 
16
17
  class DispatcherBase extends Dispatcher {
17
18
  /** @type {boolean} */
@@ -32,10 +33,11 @@ class DispatcherBase extends Dispatcher {
32
33
  constructor (opts) {
33
34
  super()
34
35
  this[kWebSocketOptions] = opts?.webSocket ?? {}
36
+ this[kEventSourceOptions] = opts?.eventSource ?? {}
35
37
  }
36
38
 
37
39
  /**
38
- * @returns {import('../../types/dispatcher').WebSocketOptions}
40
+ * @returns {import('../../types/client').Client.WebSocketOptions}
39
41
  */
40
42
  get webSocketOptions () {
41
43
  return {
@@ -44,6 +46,15 @@ class DispatcherBase extends Dispatcher {
44
46
  }
45
47
  }
46
48
 
49
+ /**
50
+ * @returns {import('../../types/client').Client.EventSourceOptions}
51
+ */
52
+ get eventSourceOptions () {
53
+ return {
54
+ maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength
55
+ }
56
+ }
57
+
47
58
  /** @returns {boolean} */
48
59
  get destroyed () {
49
60
  return this[kDestroyed]
@@ -153,13 +164,15 @@ class DispatcherBase extends Dispatcher {
153
164
  throw new InvalidArgumentError('handler must be an object')
154
165
  }
155
166
 
156
- handler = UnwrapHandler.unwrap(handler)
157
-
158
167
  try {
159
168
  if (!opts || typeof opts !== 'object') {
160
169
  throw new InvalidArgumentError('opts must be an object.')
161
170
  }
162
171
 
172
+ if (opts.dispatcher) {
173
+ throw new InvalidArgumentError('opts.dispatcher is not supported by instance methods. Pass opts.dispatcher to the top-level undici functions or call the dispatcher instance method directly.')
174
+ }
175
+
163
176
  if (this[kDestroyed] || this[kOnDestroyed]) {
164
177
  throw new ClientDestroyedError()
165
178
  }
@@ -170,11 +183,11 @@ class DispatcherBase extends Dispatcher {
170
183
 
171
184
  return this[kDispatch](opts, handler)
172
185
  } catch (err) {
173
- if (typeof handler.onError !== 'function') {
186
+ if (typeof handler.onResponseError !== 'function') {
174
187
  throw err
175
188
  }
176
189
 
177
- handler.onError(err)
190
+ handler.onResponseError(null, err)
178
191
 
179
192
  return false
180
193
  }
@@ -1,8 +1,6 @@
1
1
  'use strict'
2
2
  const EventEmitter = require('node:events')
3
- const WrapHandler = require('../handler/wrap-handler')
4
-
5
- const wrapInterceptor = (dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler))
3
+ const { kOriginless, kUrl } = require('../core/symbols')
6
4
 
7
5
  class Dispatcher extends EventEmitter {
8
6
  dispatch () {
@@ -20,6 +18,10 @@ class Dispatcher extends EventEmitter {
20
18
  compose (...args) {
21
19
  // So we handle [interceptor1, interceptor2] or interceptor1, interceptor2, ...
22
20
  const interceptors = Array.isArray(args[0]) ? args[0] : args
21
+ // null disables origin-dependent interceptors; undefined uses opts.origin.
22
+ const interceptorOrigin = this[kOriginless] === true
23
+ ? null
24
+ : this[kUrl]?.origin
23
25
  let dispatch = this.dispatch.bind(this)
24
26
 
25
27
  for (const interceptor of interceptors) {
@@ -31,14 +33,22 @@ class Dispatcher extends EventEmitter {
31
33
  throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`)
32
34
  }
33
35
 
34
- dispatch = interceptor(dispatch)
35
- dispatch = wrapInterceptor(dispatch)
36
+ dispatch = interceptor(dispatch, interceptorOrigin)
36
37
 
37
38
  if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) {
38
39
  throw new TypeError('invalid interceptor')
39
40
  }
40
41
  }
41
42
 
43
+ const originalDispatch = dispatch
44
+ const self = this
45
+ dispatch = function (opts, handler) {
46
+ if (opts && typeof opts === 'object' && !opts.origin && self[kUrl]) {
47
+ opts = Object.assign({}, opts, { origin: self[kUrl].origin })
48
+ }
49
+ return originalDispatch(opts, handler)
50
+ }
51
+
42
52
  return new Proxy(this, {
43
53
  get: (target, key) => key === 'dispatch' ? dispatch : target[key]
44
54
  })
@@ -0,0 +1,110 @@
1
+ 'use strict'
2
+
3
+ const Dispatcher = require('./dispatcher')
4
+ const { InvalidArgumentError } = require('../core/errors')
5
+ const { toRawHeaders } = require('../core/util')
6
+ const { kOriginless, kUrl } = require('../core/symbols')
7
+
8
+ class LegacyHandlerWrapper {
9
+ #handler
10
+
11
+ constructor (handler) {
12
+ this.#handler = handler
13
+ }
14
+
15
+ onRequestStart (controller, context) {
16
+ this.#handler.onConnect?.((reason) => controller.abort(reason), context)
17
+ }
18
+
19
+ onRequestUpgrade (controller, statusCode, headers, socket) {
20
+ const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})
21
+ this.#handler.onUpgrade?.(statusCode, rawHeaders, socket)
22
+ }
23
+
24
+ onResponseStart (controller, statusCode, headers, statusMessage) {
25
+ const rawHeaders = controller?.rawHeaders ?? toRawHeaders(headers ?? {})
26
+
27
+ if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {
28
+ controller.pause()
29
+ }
30
+ }
31
+
32
+ onResponseData (controller, chunk) {
33
+ if (this.#handler.onData?.(chunk) === false) {
34
+ controller.pause()
35
+ }
36
+ }
37
+
38
+ onResponseEnd (controller, trailers) {
39
+ const rawTrailers = controller?.rawTrailers ?? toRawHeaders(trailers ?? {})
40
+ this.#handler.onComplete?.(rawTrailers)
41
+ }
42
+
43
+ onResponseError (_controller, err) {
44
+ if (!this.#handler.onError) {
45
+ throw err
46
+ }
47
+
48
+ this.#handler.onError(err)
49
+ }
50
+
51
+ onBodySent (chunk) {
52
+ this.#handler.onBodySent?.(chunk)
53
+ }
54
+
55
+ onRequestSent () {
56
+ this.#handler.onRequestSent?.()
57
+ }
58
+
59
+ onResponseStarted () {
60
+ this.#handler.onResponseStarted?.()
61
+ }
62
+ }
63
+
64
+ class Dispatcher1Wrapper extends Dispatcher {
65
+ #dispatcher
66
+
67
+ constructor (dispatcher) {
68
+ super()
69
+
70
+ if (!dispatcher || typeof dispatcher.dispatch !== 'function') {
71
+ throw new InvalidArgumentError('Argument dispatcher must implement dispatch')
72
+ }
73
+
74
+ this.#dispatcher = dispatcher
75
+ this[kUrl] = dispatcher[kUrl]
76
+ this[kOriginless] = dispatcher[kOriginless]
77
+ }
78
+
79
+ static wrapHandler (handler) {
80
+ if (!handler || typeof handler !== 'object') {
81
+ throw new InvalidArgumentError('handler must be an object')
82
+ }
83
+
84
+ if (typeof handler.onRequestStart === 'function') {
85
+ return handler
86
+ }
87
+
88
+ return new LegacyHandlerWrapper(handler)
89
+ }
90
+
91
+ dispatch (opts, handler) {
92
+ // Legacy (v1) consumers do not support HTTP/2, so force HTTP/1.1.
93
+ // See https://github.com/nodejs/undici/issues/4989
94
+ if (opts.allowH2 !== false) {
95
+ opts = { ...opts, allowH2: false }
96
+ }
97
+
98
+ return this.#dispatcher.dispatch(opts, Dispatcher1Wrapper.wrapHandler(handler))
99
+ }
100
+
101
+ close (...args) {
102
+ return this.#dispatcher.close(...args)
103
+ }
104
+
105
+ destroy (...args) {
106
+ return this.#dispatcher.destroy(...args)
107
+ }
108
+ }
109
+
110
+ module.exports = Dispatcher1Wrapper
@@ -16,7 +16,7 @@ class EnvHttpProxyAgent extends DispatcherBase {
16
16
  #opts = null
17
17
 
18
18
  constructor (opts = {}) {
19
- super()
19
+ super(opts)
20
20
  this.#opts = opts
21
21
 
22
22
  const { httpProxy, httpsProxy, noProxy, ...agentOpts } = opts
@@ -65,9 +65,17 @@ class EnvHttpProxyAgent extends DispatcherBase {
65
65
  #getProxyAgentForUrl (url) {
66
66
  let { protocol, host: hostname, port } = url
67
67
 
68
- // Stripping ports in this way instead of using parsedUrl.hostname to make
69
- // sure that the brackets around IPv6 addresses are kept.
70
- hostname = hostname.replace(/:\d*$/, '').toLowerCase()
68
+ // Remove the port suffix (e.g. ":8080") and then strip surrounding
69
+ // brackets from IPv6 literals (e.g. "[::1]" -> "::1") so that the
70
+ // result matches the unbracketed form stored by #parseNoProxy.
71
+ hostname = hostname.replace(/:\d*$/, '').replace(/^\[(.+)\]$/, '$1').toLowerCase()
72
+ // Drop a trailing dot: it only marks the fully qualified form of a domain
73
+ // name ("example.com." and "example.com" are the same name, RFC 1034 root
74
+ // label). This runs on every dispatch, so it is a charCode check rather
75
+ // than a third regex. `length > 1` leaves the degenerate host "." alone.
76
+ if (hostname.length > 1 && hostname.charCodeAt(hostname.length - 1) === 46) {
77
+ hostname = hostname.slice(0, -1)
78
+ }
71
79
  port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0
72
80
  if (!this.#shouldProxy(hostname, port)) {
73
81
  return this[kNoProxyAgent]
@@ -119,11 +127,32 @@ class EnvHttpProxyAgent extends DispatcherBase {
119
127
  if (!entry) {
120
128
  continue
121
129
  }
122
- const parsed = entry.match(/^(.+):(\d+)$/)
130
+
131
+ // An IPv6 entry with a port must be bracketed: [::1]:443.
132
+ // A bare IPv6 address like ::1 contains colons that must not be
133
+ // confused with a host:port separator, so we handle it separately.
134
+ let hostname, port
135
+ const ipv6WithPort = entry.match(/^\[(.+)\]:(\d+)$/)
136
+ if (ipv6WithPort) {
137
+ hostname = ipv6WithPort[1]
138
+ port = Number.parseInt(ipv6WithPort[2], 10)
139
+ } else {
140
+ // Bracketed IPv6 without port, or plain hostname[:port], or bare IPv6.
141
+ // Strip optional brackets first.
142
+ const unbracketed = entry.replace(/^\[(.+)\]$/, '$1')
143
+ // A bare IPv6 address contains multiple colons; a hostname:port entry
144
+ // has exactly one colon followed by digits. Only attempt host:port
145
+ // splitting when that is unambiguously the case.
146
+ const colonCount = (unbracketed.match(/:/g) || []).length
147
+ const parsed = colonCount === 1 && unbracketed.match(/^(.+):(\d+)$/)
148
+ hostname = parsed ? parsed[1] : unbracketed
149
+ port = parsed ? Number.parseInt(parsed[2], 10) : 0
150
+ }
151
+
123
152
  noProxyEntries.push({
124
- // strip leading dot or asterisk with dot
125
- hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, '').toLowerCase(),
126
- port: parsed ? Number.parseInt(parsed[2], 10) : 0
153
+ // strip leading dot or asterisk with dot, and any trailing dot
154
+ hostname: hostname.replace(/^\*?\./, '').replace(/^(.+)\.$/, '$1').toLowerCase(),
155
+ port
127
156
  })
128
157
  }
129
158
 
@@ -17,15 +17,15 @@ class H2CClient extends Client {
17
17
 
18
18
  const { maxConcurrentStreams, pipelining, ...opts } =
19
19
  clientOpts ?? {}
20
- let defaultMaxConcurrentStreams = 100
20
+ const defaultMaxConcurrentStreams = maxConcurrentStreams ?? 100
21
21
  let defaultPipelining = 100
22
22
 
23
23
  if (
24
24
  maxConcurrentStreams != null &&
25
- Number.isInteger(maxConcurrentStreams) &&
26
- maxConcurrentStreams > 0
25
+ (!Number.isInteger(maxConcurrentStreams) ||
26
+ maxConcurrentStreams < 1)
27
27
  ) {
28
- defaultMaxConcurrentStreams = maxConcurrentStreams
28
+ throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0')
29
29
  }
30
30
 
31
31
  if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {
@@ -14,6 +14,7 @@ const kOnConnect = Symbol('onConnect')
14
14
  const kOnDisconnect = Symbol('onDisconnect')
15
15
  const kOnConnectionError = Symbol('onConnectionError')
16
16
  const kGetDispatcher = Symbol('get dispatcher')
17
+ const kHasDispatcher = Symbol('has dispatcher')
17
18
  const kAddClient = Symbol('add client')
18
19
  const kRemoveClient = Symbol('remove client')
19
20
 
@@ -143,7 +144,7 @@ class PoolBase extends DispatcherBase {
143
144
  if (!item) {
144
145
  break
145
146
  }
146
- item.handler.onError(err)
147
+ item.handler.onResponseError(null, err)
147
148
  }
148
149
 
149
150
  const destroyAll = new Array(this[kClients].length)
@@ -162,12 +163,28 @@ class PoolBase extends DispatcherBase {
162
163
  this[kQueued]++
163
164
  } else if (!dispatcher.dispatch(opts, handler)) {
164
165
  dispatcher[kNeedDrain] = true
165
- this[kNeedDrain] = !this[kGetDispatcher]()
166
+ this[kNeedDrain] = !this[kHasDispatcher]()
166
167
  }
167
168
 
168
169
  return !this[kNeedDrain]
169
170
  }
170
171
 
172
+ [kHasDispatcher] () {
173
+ for (let i = 0; i < this[kClients].length; i++) {
174
+ const dispatcher = this[kClients][i]
175
+
176
+ if (
177
+ !dispatcher[kNeedDrain] &&
178
+ dispatcher.closed !== true &&
179
+ dispatcher.destroyed !== true
180
+ ) {
181
+ return true
182
+ }
183
+ }
184
+
185
+ return false
186
+ }
187
+
171
188
  [kAddClient] (client) {
172
189
  client
173
190
  .on('drain', this[kOnDrain].bind(this, client))
@@ -189,14 +206,14 @@ class PoolBase extends DispatcherBase {
189
206
  }
190
207
 
191
208
  [kRemoveClient] (client) {
192
- client.close(() => {
193
- const idx = this[kClients].indexOf(client)
194
- if (idx !== -1) {
195
- this[kClients].splice(idx, 1)
196
- }
197
- })
209
+ const idx = this[kClients].indexOf(client)
210
+ if (idx !== -1) {
211
+ this[kClients].splice(idx, 1)
212
+ }
213
+
214
+ client.close(() => {})
198
215
 
199
- this[kNeedDrain] = this[kClients].some(dispatcher => (
216
+ this[kNeedDrain] = !this[kClients].some(dispatcher => (
200
217
  !dispatcher[kNeedDrain] &&
201
218
  dispatcher.closed !== true &&
202
219
  dispatcher.destroyed !== true
@@ -210,5 +227,6 @@ module.exports = {
210
227
  kNeedDrain,
211
228
  kAddClient,
212
229
  kRemoveClient,
213
- kGetDispatcher
230
+ kGetDispatcher,
231
+ kHasDispatcher
214
232
  }