pi-cursor-sdk 0.1.46 → 0.1.48

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 (272) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +2 -2
  3. package/docs/cursor-live-smoke-checklist.md +4 -4
  4. package/docs/cursor-model-ux-spec.md +1 -1
  5. package/docs/cursor-native-tool-visual-audit.md +1 -1
  6. package/docs/cursor-testing-lessons.md +1 -1
  7. package/node_modules/@connectrpc/connect-node/README.md +141 -0
  8. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.d.ts +15 -0
  9. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.js +89 -0
  10. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.d.ts +42 -0
  11. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.js +61 -0
  12. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.d.ts +100 -0
  13. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.js +25 -0
  14. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.d.ts +96 -0
  15. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.js +25 -0
  16. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.d.ts +96 -0
  17. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.js +25 -0
  18. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.d.ts +146 -0
  19. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.js +536 -0
  20. package/node_modules/@connectrpc/connect-node/dist/cjs/index.d.ts +15 -0
  21. package/node_modules/@connectrpc/connect-node/dist/cjs/index.js +36 -0
  22. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.d.ts +45 -0
  23. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.js +154 -0
  24. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.d.ts +1 -0
  25. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.js +29 -0
  26. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.d.ts +89 -0
  27. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.js +58 -0
  28. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.d.ts +54 -0
  29. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.js +326 -0
  30. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.d.ts +41 -0
  31. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.js +234 -0
  32. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.d.ts +19 -0
  33. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.js +97 -0
  34. package/node_modules/@connectrpc/connect-node/dist/cjs/package.json +1 -0
  35. package/node_modules/@connectrpc/connect-node/dist/esm/compression.d.ts +15 -0
  36. package/node_modules/@connectrpc/connect-node/dist/esm/compression.js +86 -0
  37. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.d.ts +42 -0
  38. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.js +58 -0
  39. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.d.ts +100 -0
  40. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.js +22 -0
  41. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.d.ts +96 -0
  42. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.js +22 -0
  43. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.d.ts +96 -0
  44. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.js +22 -0
  45. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.d.ts +146 -0
  46. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.js +532 -0
  47. package/node_modules/@connectrpc/connect-node/dist/esm/index.d.ts +15 -0
  48. package/node_modules/@connectrpc/connect-node/dist/esm/index.js +23 -0
  49. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.d.ts +45 -0
  50. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.js +147 -0
  51. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.d.ts +1 -0
  52. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.js +27 -0
  53. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.d.ts +89 -0
  54. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.js +58 -0
  55. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.d.ts +54 -0
  56. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.js +324 -0
  57. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.d.ts +41 -0
  58. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.js +230 -0
  59. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.d.ts +19 -0
  60. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.js +93 -0
  61. package/node_modules/@connectrpc/connect-node/package.json +46 -0
  62. package/node_modules/undici/LICENSE +21 -0
  63. package/node_modules/undici/README.md +741 -0
  64. package/node_modules/undici/docs/docs/api/Agent.md +84 -0
  65. package/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  66. package/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  67. package/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
  68. package/node_modules/undici/docs/docs/api/Client.md +288 -0
  69. package/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
  70. package/node_modules/undici/docs/docs/api/Connector.md +115 -0
  71. package/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  72. package/node_modules/undici/docs/docs/api/Cookies.md +128 -0
  73. package/node_modules/undici/docs/docs/api/Debug.md +62 -0
  74. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +315 -0
  75. package/node_modules/undici/docs/docs/api/Dispatcher.md +1392 -0
  76. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
  77. package/node_modules/undici/docs/docs/api/Errors.md +49 -0
  78. package/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  79. package/node_modules/undici/docs/docs/api/Fetch.md +60 -0
  80. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
  81. package/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
  82. package/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
  83. package/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
  84. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
  85. package/node_modules/undici/docs/docs/api/MockClient.md +81 -0
  86. package/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  87. package/node_modules/undici/docs/docs/api/MockPool.md +555 -0
  88. package/node_modules/undici/docs/docs/api/Pool.md +84 -0
  89. package/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  90. package/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
  91. package/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
  92. package/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
  93. package/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
  94. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
  95. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
  96. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +275 -0
  97. package/node_modules/undici/docs/docs/api/Util.md +25 -0
  98. package/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
  99. package/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  100. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  101. package/node_modules/undici/docs/docs/best-practices/crawling.md +58 -0
  102. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
  103. package/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  104. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +224 -0
  105. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
  106. package/node_modules/undici/index-fetch.js +65 -0
  107. package/node_modules/undici/index.d.ts +3 -0
  108. package/node_modules/undici/index.js +234 -0
  109. package/node_modules/undici/lib/api/abort-signal.js +59 -0
  110. package/node_modules/undici/lib/api/api-connect.js +110 -0
  111. package/node_modules/undici/lib/api/api-pipeline.js +252 -0
  112. package/node_modules/undici/lib/api/api-request.js +214 -0
  113. package/node_modules/undici/lib/api/api-stream.js +209 -0
  114. package/node_modules/undici/lib/api/api-upgrade.js +111 -0
  115. package/node_modules/undici/lib/api/index.js +7 -0
  116. package/node_modules/undici/lib/api/readable.js +580 -0
  117. package/node_modules/undici/lib/cache/memory-cache-store.js +234 -0
  118. package/node_modules/undici/lib/cache/sqlite-cache-store.js +461 -0
  119. package/node_modules/undici/lib/core/connect.js +153 -0
  120. package/node_modules/undici/lib/core/constants.js +143 -0
  121. package/node_modules/undici/lib/core/diagnostics.js +227 -0
  122. package/node_modules/undici/lib/core/errors.js +477 -0
  123. package/node_modules/undici/lib/core/request.js +453 -0
  124. package/node_modules/undici/lib/core/socks5-client.js +422 -0
  125. package/node_modules/undici/lib/core/socks5-utils.js +212 -0
  126. package/node_modules/undici/lib/core/symbols.js +75 -0
  127. package/node_modules/undici/lib/core/tree.js +160 -0
  128. package/node_modules/undici/lib/core/util.js +992 -0
  129. package/node_modules/undici/lib/dispatcher/agent.js +158 -0
  130. package/node_modules/undici/lib/dispatcher/balanced-pool.js +219 -0
  131. package/node_modules/undici/lib/dispatcher/client-h1.js +1722 -0
  132. package/node_modules/undici/lib/dispatcher/client-h2.js +995 -0
  133. package/node_modules/undici/lib/dispatcher/client.js +664 -0
  134. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +184 -0
  135. package/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
  136. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
  137. package/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
  138. package/node_modules/undici/lib/dispatcher/h2c-client.js +51 -0
  139. package/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
  140. package/node_modules/undici/lib/dispatcher/pool.js +118 -0
  141. package/node_modules/undici/lib/dispatcher/proxy-agent.js +319 -0
  142. package/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  143. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +137 -0
  144. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +260 -0
  145. package/node_modules/undici/lib/encoding/index.js +33 -0
  146. package/node_modules/undici/lib/global.js +59 -0
  147. package/node_modules/undici/lib/handler/cache-handler.js +578 -0
  148. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +124 -0
  149. package/node_modules/undici/lib/handler/decorator-handler.js +67 -0
  150. package/node_modules/undici/lib/handler/deduplication-handler.js +460 -0
  151. package/node_modules/undici/lib/handler/redirect-handler.js +238 -0
  152. package/node_modules/undici/lib/handler/retry-handler.js +394 -0
  153. package/node_modules/undici/lib/handler/unwrap-handler.js +106 -0
  154. package/node_modules/undici/lib/handler/wrap-handler.js +105 -0
  155. package/node_modules/undici/lib/interceptor/cache.js +495 -0
  156. package/node_modules/undici/lib/interceptor/decompress.js +259 -0
  157. package/node_modules/undici/lib/interceptor/deduplicate.js +117 -0
  158. package/node_modules/undici/lib/interceptor/dns.js +571 -0
  159. package/node_modules/undici/lib/interceptor/dump.js +112 -0
  160. package/node_modules/undici/lib/interceptor/redirect.js +21 -0
  161. package/node_modules/undici/lib/interceptor/response-error.js +95 -0
  162. package/node_modules/undici/lib/interceptor/retry.js +19 -0
  163. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  164. package/node_modules/undici/lib/llhttp/constants.d.ts +195 -0
  165. package/node_modules/undici/lib/llhttp/constants.js +531 -0
  166. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
  167. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
  168. package/node_modules/undici/lib/llhttp/utils.d.ts +2 -0
  169. package/node_modules/undici/lib/llhttp/utils.js +12 -0
  170. package/node_modules/undici/lib/mock/mock-agent.js +232 -0
  171. package/node_modules/undici/lib/mock/mock-call-history.js +248 -0
  172. package/node_modules/undici/lib/mock/mock-client.js +68 -0
  173. package/node_modules/undici/lib/mock/mock-errors.js +29 -0
  174. package/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
  175. package/node_modules/undici/lib/mock/mock-pool.js +68 -0
  176. package/node_modules/undici/lib/mock/mock-symbols.js +32 -0
  177. package/node_modules/undici/lib/mock/mock-utils.js +486 -0
  178. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  179. package/node_modules/undici/lib/mock/snapshot-agent.js +353 -0
  180. package/node_modules/undici/lib/mock/snapshot-recorder.js +588 -0
  181. package/node_modules/undici/lib/mock/snapshot-utils.js +158 -0
  182. package/node_modules/undici/lib/util/cache.js +414 -0
  183. package/node_modules/undici/lib/util/date.js +653 -0
  184. package/node_modules/undici/lib/util/promise.js +28 -0
  185. package/node_modules/undici/lib/util/runtime-features.js +124 -0
  186. package/node_modules/undici/lib/util/stats.js +32 -0
  187. package/node_modules/undici/lib/util/timers.js +425 -0
  188. package/node_modules/undici/lib/web/cache/cache.js +864 -0
  189. package/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  190. package/node_modules/undici/lib/web/cache/util.js +45 -0
  191. package/node_modules/undici/lib/web/cookies/constants.js +12 -0
  192. package/node_modules/undici/lib/web/cookies/index.js +199 -0
  193. package/node_modules/undici/lib/web/cookies/parse.js +314 -0
  194. package/node_modules/undici/lib/web/cookies/util.js +282 -0
  195. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +399 -0
  196. package/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
  197. package/node_modules/undici/lib/web/eventsource/util.js +29 -0
  198. package/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  199. package/node_modules/undici/lib/web/fetch/body.js +509 -0
  200. package/node_modules/undici/lib/web/fetch/constants.js +131 -0
  201. package/node_modules/undici/lib/web/fetch/data-url.js +596 -0
  202. package/node_modules/undici/lib/web/fetch/formdata-parser.js +586 -0
  203. package/node_modules/undici/lib/web/fetch/formdata.js +259 -0
  204. package/node_modules/undici/lib/web/fetch/global.js +40 -0
  205. package/node_modules/undici/lib/web/fetch/headers.js +719 -0
  206. package/node_modules/undici/lib/web/fetch/index.js +2413 -0
  207. package/node_modules/undici/lib/web/fetch/request.js +1115 -0
  208. package/node_modules/undici/lib/web/fetch/response.js +641 -0
  209. package/node_modules/undici/lib/web/fetch/util.js +1522 -0
  210. package/node_modules/undici/lib/web/infra/index.js +229 -0
  211. package/node_modules/undici/lib/web/subresource-integrity/Readme.md +9 -0
  212. package/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +307 -0
  213. package/node_modules/undici/lib/web/webidl/index.js +1006 -0
  214. package/node_modules/undici/lib/web/websocket/connection.js +329 -0
  215. package/node_modules/undici/lib/web/websocket/constants.js +126 -0
  216. package/node_modules/undici/lib/web/websocket/events.js +331 -0
  217. package/node_modules/undici/lib/web/websocket/frame.js +133 -0
  218. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +100 -0
  219. package/node_modules/undici/lib/web/websocket/receiver.js +507 -0
  220. package/node_modules/undici/lib/web/websocket/sender.js +109 -0
  221. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +104 -0
  222. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +498 -0
  223. package/node_modules/undici/lib/web/websocket/util.js +347 -0
  224. package/node_modules/undici/lib/web/websocket/websocket.js +758 -0
  225. package/node_modules/undici/package.json +152 -0
  226. package/node_modules/undici/scripts/strip-comments.js +10 -0
  227. package/node_modules/undici/types/README.md +6 -0
  228. package/node_modules/undici/types/agent.d.ts +32 -0
  229. package/node_modules/undici/types/api.d.ts +43 -0
  230. package/node_modules/undici/types/balanced-pool.d.ts +30 -0
  231. package/node_modules/undici/types/cache-interceptor.d.ts +179 -0
  232. package/node_modules/undici/types/cache.d.ts +36 -0
  233. package/node_modules/undici/types/client-stats.d.ts +15 -0
  234. package/node_modules/undici/types/client.d.ts +139 -0
  235. package/node_modules/undici/types/connector.d.ts +36 -0
  236. package/node_modules/undici/types/content-type.d.ts +21 -0
  237. package/node_modules/undici/types/cookies.d.ts +30 -0
  238. package/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
  239. package/node_modules/undici/types/dispatcher.d.ts +275 -0
  240. package/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
  241. package/node_modules/undici/types/errors.d.ts +177 -0
  242. package/node_modules/undici/types/eventsource.d.ts +66 -0
  243. package/node_modules/undici/types/fetch.d.ts +231 -0
  244. package/node_modules/undici/types/formdata.d.ts +114 -0
  245. package/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  246. package/node_modules/undici/types/global-origin.d.ts +7 -0
  247. package/node_modules/undici/types/h2c-client.d.ts +73 -0
  248. package/node_modules/undici/types/handlers.d.ts +14 -0
  249. package/node_modules/undici/types/header.d.ts +160 -0
  250. package/node_modules/undici/types/index.d.ts +91 -0
  251. package/node_modules/undici/types/interceptors.d.ts +80 -0
  252. package/node_modules/undici/types/mock-agent.d.ts +68 -0
  253. package/node_modules/undici/types/mock-call-history.d.ts +111 -0
  254. package/node_modules/undici/types/mock-client.d.ts +27 -0
  255. package/node_modules/undici/types/mock-errors.d.ts +12 -0
  256. package/node_modules/undici/types/mock-interceptor.d.ts +94 -0
  257. package/node_modules/undici/types/mock-pool.d.ts +27 -0
  258. package/node_modules/undici/types/patch.d.ts +29 -0
  259. package/node_modules/undici/types/pool-stats.d.ts +19 -0
  260. package/node_modules/undici/types/pool.d.ts +41 -0
  261. package/node_modules/undici/types/proxy-agent.d.ts +29 -0
  262. package/node_modules/undici/types/readable.d.ts +68 -0
  263. package/node_modules/undici/types/retry-agent.d.ts +8 -0
  264. package/node_modules/undici/types/retry-handler.d.ts +125 -0
  265. package/node_modules/undici/types/round-robin-pool.d.ts +41 -0
  266. package/node_modules/undici/types/snapshot-agent.d.ts +109 -0
  267. package/node_modules/undici/types/socks5-proxy-agent.d.ts +25 -0
  268. package/node_modules/undici/types/util.d.ts +18 -0
  269. package/node_modules/undici/types/utility.d.ts +7 -0
  270. package/node_modules/undici/types/webidl.d.ts +347 -0
  271. package/node_modules/undici/types/websocket.d.ts +188 -0
  272. package/package.json +10 -5
@@ -0,0 +1,153 @@
1
+ 'use strict'
2
+
3
+ const net = require('node:net')
4
+ const assert = require('node:assert')
5
+ const util = require('./util')
6
+ const { InvalidArgumentError } = require('./errors')
7
+
8
+ let tls // include tls conditionally since it is not always available
9
+
10
+ // TODO: session re-use does not wait for the first
11
+ // connection to resolve the session and might therefore
12
+ // resolve the same servername multiple times even when
13
+ // re-use is enabled.
14
+
15
+ const SessionCache = class WeakSessionCache {
16
+ constructor (maxCachedSessions) {
17
+ this._maxCachedSessions = maxCachedSessions
18
+ this._sessionCache = new Map()
19
+ this._sessionRegistry = new FinalizationRegistry((key) => {
20
+ if (this._sessionCache.size < this._maxCachedSessions) {
21
+ return
22
+ }
23
+
24
+ const ref = this._sessionCache.get(key)
25
+ if (ref !== undefined && ref.deref() === undefined) {
26
+ this._sessionCache.delete(key)
27
+ }
28
+ })
29
+ }
30
+
31
+ get (sessionKey) {
32
+ const ref = this._sessionCache.get(sessionKey)
33
+ return ref ? ref.deref() : null
34
+ }
35
+
36
+ set (sessionKey, session) {
37
+ if (this._maxCachedSessions === 0) {
38
+ return
39
+ }
40
+
41
+ if (this._sessionCache.has(sessionKey)) {
42
+ this._sessionCache.delete(sessionKey)
43
+ } else if (this._sessionCache.size >= this._maxCachedSessions) {
44
+ for (const [key, ref] of this._sessionCache) {
45
+ if (ref.deref() === undefined) {
46
+ this._sessionCache.delete(key)
47
+ return
48
+ }
49
+ }
50
+
51
+ const oldest = this._sessionCache.keys().next()
52
+ if (!oldest.done) {
53
+ this._sessionCache.delete(oldest.value)
54
+ }
55
+ }
56
+
57
+ this._sessionCache.set(sessionKey, new WeakRef(session))
58
+ this._sessionRegistry.register(session, sessionKey)
59
+ }
60
+ }
61
+
62
+ function buildConnector ({ allowH2, useH2c, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) {
63
+ if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {
64
+ throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')
65
+ }
66
+
67
+ const options = { path: socketPath, ...opts }
68
+ const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)
69
+ timeout = timeout == null ? 10e3 : timeout
70
+ allowH2 = allowH2 != null ? allowH2 : false
71
+ return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
72
+ let socket
73
+ if (protocol === 'https:') {
74
+ if (!tls) {
75
+ tls = require('node:tls')
76
+ }
77
+ servername = servername || options.servername || util.getServerName(host) || null
78
+
79
+ const sessionKey = servername || hostname
80
+ assert(sessionKey)
81
+
82
+ const session = customSession || sessionCache.get(sessionKey) || null
83
+
84
+ port = port || 443
85
+
86
+ socket = tls.connect({
87
+ highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...
88
+ ...options,
89
+ servername,
90
+ session,
91
+ localAddress,
92
+ ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],
93
+ socket: httpSocket, // upgrade socket connection
94
+ port,
95
+ host: hostname
96
+ })
97
+
98
+ socket
99
+ .on('session', function (session) {
100
+ // TODO (fix): Can a session become invalid once established? Don't think so?
101
+ sessionCache.set(sessionKey, session)
102
+ })
103
+ } else {
104
+ assert(!httpSocket, 'httpSocket can only be sent on TLS update')
105
+
106
+ port = port || 80
107
+
108
+ socket = net.connect({
109
+ highWaterMark: 64 * 1024, // Same as nodejs fs streams.
110
+ ...options,
111
+ localAddress,
112
+ port,
113
+ host: hostname
114
+ })
115
+ if (useH2c === true) {
116
+ socket.alpnProtocol = 'h2'
117
+ }
118
+ }
119
+
120
+ // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket
121
+ if (options.keepAlive == null || options.keepAlive) {
122
+ const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay
123
+ socket.setKeepAlive(true, keepAliveInitialDelay)
124
+ }
125
+
126
+ const clearConnectTimeout = util.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port })
127
+
128
+ socket
129
+ .setNoDelay(true)
130
+ .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {
131
+ queueMicrotask(clearConnectTimeout)
132
+
133
+ if (callback) {
134
+ const cb = callback
135
+ callback = null
136
+ cb(null, this)
137
+ }
138
+ })
139
+ .on('error', function (err) {
140
+ queueMicrotask(clearConnectTimeout)
141
+
142
+ if (callback) {
143
+ const cb = callback
144
+ callback = null
145
+ cb(err)
146
+ }
147
+ })
148
+
149
+ return socket
150
+ }
151
+ }
152
+
153
+ module.exports = buildConnector
@@ -0,0 +1,143 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * @see https://developer.mozilla.org/docs/Web/HTTP/Headers
5
+ */
6
+ const wellknownHeaderNames = /** @type {const} */ ([
7
+ 'Accept',
8
+ 'Accept-Encoding',
9
+ 'Accept-Language',
10
+ 'Accept-Ranges',
11
+ 'Access-Control-Allow-Credentials',
12
+ 'Access-Control-Allow-Headers',
13
+ 'Access-Control-Allow-Methods',
14
+ 'Access-Control-Allow-Origin',
15
+ 'Access-Control-Expose-Headers',
16
+ 'Access-Control-Max-Age',
17
+ 'Access-Control-Request-Headers',
18
+ 'Access-Control-Request-Method',
19
+ 'Age',
20
+ 'Allow',
21
+ 'Alt-Svc',
22
+ 'Alt-Used',
23
+ 'Authorization',
24
+ 'Cache-Control',
25
+ 'Clear-Site-Data',
26
+ 'Connection',
27
+ 'Content-Disposition',
28
+ 'Content-Encoding',
29
+ 'Content-Language',
30
+ 'Content-Length',
31
+ 'Content-Location',
32
+ 'Content-Range',
33
+ 'Content-Security-Policy',
34
+ 'Content-Security-Policy-Report-Only',
35
+ 'Content-Type',
36
+ 'Cookie',
37
+ 'Cross-Origin-Embedder-Policy',
38
+ 'Cross-Origin-Opener-Policy',
39
+ 'Cross-Origin-Resource-Policy',
40
+ 'Date',
41
+ 'Device-Memory',
42
+ 'Downlink',
43
+ 'ECT',
44
+ 'ETag',
45
+ 'Expect',
46
+ 'Expect-CT',
47
+ 'Expires',
48
+ 'Forwarded',
49
+ 'From',
50
+ 'Host',
51
+ 'If-Match',
52
+ 'If-Modified-Since',
53
+ 'If-None-Match',
54
+ 'If-Range',
55
+ 'If-Unmodified-Since',
56
+ 'Keep-Alive',
57
+ 'Last-Modified',
58
+ 'Link',
59
+ 'Location',
60
+ 'Max-Forwards',
61
+ 'Origin',
62
+ 'Permissions-Policy',
63
+ 'Pragma',
64
+ 'Proxy-Authenticate',
65
+ 'Proxy-Authorization',
66
+ 'RTT',
67
+ 'Range',
68
+ 'Referer',
69
+ 'Referrer-Policy',
70
+ 'Refresh',
71
+ 'Retry-After',
72
+ 'Sec-WebSocket-Accept',
73
+ 'Sec-WebSocket-Extensions',
74
+ 'Sec-WebSocket-Key',
75
+ 'Sec-WebSocket-Protocol',
76
+ 'Sec-WebSocket-Version',
77
+ 'Server',
78
+ 'Server-Timing',
79
+ 'Service-Worker-Allowed',
80
+ 'Service-Worker-Navigation-Preload',
81
+ 'Set-Cookie',
82
+ 'SourceMap',
83
+ 'Strict-Transport-Security',
84
+ 'Supports-Loading-Mode',
85
+ 'TE',
86
+ 'Timing-Allow-Origin',
87
+ 'Trailer',
88
+ 'Transfer-Encoding',
89
+ 'Upgrade',
90
+ 'Upgrade-Insecure-Requests',
91
+ 'User-Agent',
92
+ 'Vary',
93
+ 'Via',
94
+ 'WWW-Authenticate',
95
+ 'X-Content-Type-Options',
96
+ 'X-DNS-Prefetch-Control',
97
+ 'X-Frame-Options',
98
+ 'X-Permitted-Cross-Domain-Policies',
99
+ 'X-Powered-By',
100
+ 'X-Requested-With',
101
+ 'X-XSS-Protection'
102
+ ])
103
+
104
+ /** @type {Record<typeof wellknownHeaderNames[number]|Lowercase<typeof wellknownHeaderNames[number]>, string>} */
105
+ const headerNameLowerCasedRecord = {}
106
+
107
+ // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
108
+ Object.setPrototypeOf(headerNameLowerCasedRecord, null)
109
+
110
+ /**
111
+ * @type {Record<Lowercase<typeof wellknownHeaderNames[number]>, Buffer>}
112
+ */
113
+ const wellknownHeaderNameBuffers = {}
114
+
115
+ // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
116
+ Object.setPrototypeOf(wellknownHeaderNameBuffers, null)
117
+
118
+ /**
119
+ * @param {string} header Lowercased header
120
+ * @returns {Buffer}
121
+ */
122
+ function getHeaderNameAsBuffer (header) {
123
+ let buffer = wellknownHeaderNameBuffers[header]
124
+
125
+ if (buffer === undefined) {
126
+ buffer = Buffer.from(header)
127
+ }
128
+
129
+ return buffer
130
+ }
131
+
132
+ for (let i = 0; i < wellknownHeaderNames.length; ++i) {
133
+ const key = wellknownHeaderNames[i]
134
+ const lowerCasedKey = key.toLowerCase()
135
+ headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] =
136
+ lowerCasedKey
137
+ }
138
+
139
+ module.exports = {
140
+ wellknownHeaderNames,
141
+ headerNameLowerCasedRecord,
142
+ getHeaderNameAsBuffer
143
+ }
@@ -0,0 +1,227 @@
1
+ 'use strict'
2
+
3
+ const diagnosticsChannel = require('node:diagnostics_channel')
4
+ const util = require('node:util')
5
+
6
+ const undiciDebugLog = util.debuglog('undici')
7
+ const fetchDebuglog = util.debuglog('fetch')
8
+ const websocketDebuglog = util.debuglog('websocket')
9
+
10
+ const channels = {
11
+ // Client
12
+ beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'),
13
+ connected: diagnosticsChannel.channel('undici:client:connected'),
14
+ connectError: diagnosticsChannel.channel('undici:client:connectError'),
15
+ sendHeaders: diagnosticsChannel.channel('undici:client:sendHeaders'),
16
+ // Request
17
+ create: diagnosticsChannel.channel('undici:request:create'),
18
+ bodySent: diagnosticsChannel.channel('undici:request:bodySent'),
19
+ bodyChunkSent: diagnosticsChannel.channel('undici:request:bodyChunkSent'),
20
+ bodyChunkReceived: diagnosticsChannel.channel('undici:request:bodyChunkReceived'),
21
+ headers: diagnosticsChannel.channel('undici:request:headers'),
22
+ trailers: diagnosticsChannel.channel('undici:request:trailers'),
23
+ error: diagnosticsChannel.channel('undici:request:error'),
24
+ // WebSocket
25
+ open: diagnosticsChannel.channel('undici:websocket:open'),
26
+ close: diagnosticsChannel.channel('undici:websocket:close'),
27
+ socketError: diagnosticsChannel.channel('undici:websocket:socket_error'),
28
+ ping: diagnosticsChannel.channel('undici:websocket:ping'),
29
+ pong: diagnosticsChannel.channel('undici:websocket:pong'),
30
+ // ProxyAgent
31
+ proxyConnected: diagnosticsChannel.channel('undici:proxy:connected')
32
+ }
33
+
34
+ let isTrackingClientEvents = false
35
+
36
+ function trackClientEvents (debugLog = undiciDebugLog) {
37
+ if (isTrackingClientEvents) {
38
+ return
39
+ }
40
+
41
+ // Check if any of the channels already have subscribers to prevent duplicate subscriptions
42
+ // This can happen when both Node.js built-in undici and undici as a dependency are present
43
+ if (channels.beforeConnect.hasSubscribers || channels.connected.hasSubscribers ||
44
+ channels.connectError.hasSubscribers || channels.sendHeaders.hasSubscribers) {
45
+ isTrackingClientEvents = true
46
+ return
47
+ }
48
+
49
+ isTrackingClientEvents = true
50
+
51
+ diagnosticsChannel.subscribe('undici:client:beforeConnect',
52
+ evt => {
53
+ const {
54
+ connectParams: { version, protocol, port, host }
55
+ } = evt
56
+ debugLog(
57
+ 'connecting to %s%s using %s%s',
58
+ host,
59
+ port ? `:${port}` : '',
60
+ protocol,
61
+ version
62
+ )
63
+ })
64
+
65
+ diagnosticsChannel.subscribe('undici:client:connected',
66
+ evt => {
67
+ const {
68
+ connectParams: { version, protocol, port, host }
69
+ } = evt
70
+ debugLog(
71
+ 'connected to %s%s using %s%s',
72
+ host,
73
+ port ? `:${port}` : '',
74
+ protocol,
75
+ version
76
+ )
77
+ })
78
+
79
+ diagnosticsChannel.subscribe('undici:client:connectError',
80
+ evt => {
81
+ const {
82
+ connectParams: { version, protocol, port, host },
83
+ error
84
+ } = evt
85
+ debugLog(
86
+ 'connection to %s%s using %s%s errored - %s',
87
+ host,
88
+ port ? `:${port}` : '',
89
+ protocol,
90
+ version,
91
+ error.message
92
+ )
93
+ })
94
+
95
+ diagnosticsChannel.subscribe('undici:client:sendHeaders',
96
+ evt => {
97
+ const {
98
+ request: { method, path, origin }
99
+ } = evt
100
+ debugLog('sending request to %s %s%s', method, origin, path)
101
+ })
102
+ }
103
+
104
+ let isTrackingRequestEvents = false
105
+
106
+ function trackRequestEvents (debugLog = undiciDebugLog) {
107
+ if (isTrackingRequestEvents) {
108
+ return
109
+ }
110
+
111
+ // Check if any of the channels already have subscribers to prevent duplicate subscriptions
112
+ // This can happen when both Node.js built-in undici and undici as a dependency are present
113
+ if (channels.headers.hasSubscribers || channels.trailers.hasSubscribers ||
114
+ channels.error.hasSubscribers) {
115
+ isTrackingRequestEvents = true
116
+ return
117
+ }
118
+
119
+ isTrackingRequestEvents = true
120
+
121
+ diagnosticsChannel.subscribe('undici:request:headers',
122
+ evt => {
123
+ const {
124
+ request: { method, path, origin },
125
+ response: { statusCode }
126
+ } = evt
127
+ debugLog(
128
+ 'received response to %s %s%s - HTTP %d',
129
+ method,
130
+ origin,
131
+ path,
132
+ statusCode
133
+ )
134
+ })
135
+
136
+ diagnosticsChannel.subscribe('undici:request:trailers',
137
+ evt => {
138
+ const {
139
+ request: { method, path, origin }
140
+ } = evt
141
+ debugLog('trailers received from %s %s%s', method, origin, path)
142
+ })
143
+
144
+ diagnosticsChannel.subscribe('undici:request:error',
145
+ evt => {
146
+ const {
147
+ request: { method, path, origin },
148
+ error
149
+ } = evt
150
+ debugLog(
151
+ 'request to %s %s%s errored - %s',
152
+ method,
153
+ origin,
154
+ path,
155
+ error.message
156
+ )
157
+ })
158
+ }
159
+
160
+ let isTrackingWebSocketEvents = false
161
+
162
+ function trackWebSocketEvents (debugLog = websocketDebuglog) {
163
+ if (isTrackingWebSocketEvents) {
164
+ return
165
+ }
166
+
167
+ // Check if any of the channels already have subscribers to prevent duplicate subscriptions
168
+ // This can happen when both Node.js built-in undici and undici as a dependency are present
169
+ if (channels.open.hasSubscribers || channels.close.hasSubscribers ||
170
+ channels.socketError.hasSubscribers || channels.ping.hasSubscribers ||
171
+ channels.pong.hasSubscribers) {
172
+ isTrackingWebSocketEvents = true
173
+ return
174
+ }
175
+
176
+ isTrackingWebSocketEvents = true
177
+
178
+ diagnosticsChannel.subscribe('undici:websocket:open',
179
+ evt => {
180
+ if (evt.address != null) {
181
+ const { address, port } = evt.address
182
+ debugLog('connection opened %s%s', address, port ? `:${port}` : '')
183
+ } else {
184
+ debugLog('connection opened')
185
+ }
186
+ })
187
+
188
+ diagnosticsChannel.subscribe('undici:websocket:close',
189
+ evt => {
190
+ const { websocket, code, reason } = evt
191
+ debugLog(
192
+ 'closed connection to %s - %s %s',
193
+ websocket.url,
194
+ code,
195
+ reason
196
+ )
197
+ })
198
+
199
+ diagnosticsChannel.subscribe('undici:websocket:socket_error',
200
+ err => {
201
+ debugLog('connection errored - %s', err.message)
202
+ })
203
+
204
+ diagnosticsChannel.subscribe('undici:websocket:ping',
205
+ evt => {
206
+ debugLog('ping received')
207
+ })
208
+
209
+ diagnosticsChannel.subscribe('undici:websocket:pong',
210
+ evt => {
211
+ debugLog('pong received')
212
+ })
213
+ }
214
+
215
+ if (undiciDebugLog.enabled || fetchDebuglog.enabled) {
216
+ trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)
217
+ trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog)
218
+ }
219
+
220
+ if (websocketDebuglog.enabled) {
221
+ trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog)
222
+ trackWebSocketEvents(websocketDebuglog)
223
+ }
224
+
225
+ module.exports = {
226
+ channels
227
+ }