pi-cursor-sdk 0.1.50 → 0.1.51

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 (276) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/docs/cursor-live-smoke-checklist.md +4 -4
  4. package/docs/cursor-model-ux-spec.md +5 -5
  5. package/docs/cursor-native-tool-replay.md +2 -2
  6. package/docs/cursor-native-tool-visual-audit.md +1 -1
  7. package/docs/cursor-testing-lessons.md +1 -1
  8. package/package.json +3 -12
  9. package/src/cursor-fallback-models.generated.ts +536 -302
  10. package/src/cursor-provider-errors.ts +29 -0
  11. package/src/cursor-tool-manifest.ts +1 -1
  12. package/node_modules/@connectrpc/connect-node/README.md +0 -141
  13. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.d.ts +0 -15
  14. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.js +0 -89
  15. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.d.ts +0 -42
  16. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.js +0 -61
  17. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.d.ts +0 -100
  18. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.js +0 -25
  19. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.d.ts +0 -96
  20. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.js +0 -25
  21. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.d.ts +0 -96
  22. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.js +0 -25
  23. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.d.ts +0 -146
  24. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.js +0 -536
  25. package/node_modules/@connectrpc/connect-node/dist/cjs/index.d.ts +0 -15
  26. package/node_modules/@connectrpc/connect-node/dist/cjs/index.js +0 -36
  27. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.d.ts +0 -45
  28. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.js +0 -154
  29. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.d.ts +0 -1
  30. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.js +0 -29
  31. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.d.ts +0 -89
  32. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.js +0 -58
  33. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.d.ts +0 -54
  34. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.js +0 -326
  35. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.d.ts +0 -41
  36. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.js +0 -234
  37. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.d.ts +0 -19
  38. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.js +0 -97
  39. package/node_modules/@connectrpc/connect-node/dist/cjs/package.json +0 -1
  40. package/node_modules/@connectrpc/connect-node/dist/esm/compression.d.ts +0 -15
  41. package/node_modules/@connectrpc/connect-node/dist/esm/compression.js +0 -86
  42. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.d.ts +0 -42
  43. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.js +0 -58
  44. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.d.ts +0 -100
  45. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.js +0 -22
  46. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.d.ts +0 -96
  47. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.js +0 -22
  48. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.d.ts +0 -96
  49. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.js +0 -22
  50. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.d.ts +0 -146
  51. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.js +0 -532
  52. package/node_modules/@connectrpc/connect-node/dist/esm/index.d.ts +0 -15
  53. package/node_modules/@connectrpc/connect-node/dist/esm/index.js +0 -23
  54. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.d.ts +0 -45
  55. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.js +0 -147
  56. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.d.ts +0 -1
  57. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.js +0 -27
  58. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.d.ts +0 -89
  59. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.js +0 -58
  60. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.d.ts +0 -54
  61. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.js +0 -324
  62. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.d.ts +0 -41
  63. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.js +0 -230
  64. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.d.ts +0 -19
  65. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.js +0 -93
  66. package/node_modules/@connectrpc/connect-node/package.json +0 -46
  67. package/node_modules/undici/LICENSE +0 -21
  68. package/node_modules/undici/README.md +0 -741
  69. package/node_modules/undici/docs/docs/api/Agent.md +0 -84
  70. package/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
  71. package/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
  72. package/node_modules/undici/docs/docs/api/CacheStore.md +0 -164
  73. package/node_modules/undici/docs/docs/api/Client.md +0 -288
  74. package/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
  75. package/node_modules/undici/docs/docs/api/Connector.md +0 -115
  76. package/node_modules/undici/docs/docs/api/ContentType.md +0 -57
  77. package/node_modules/undici/docs/docs/api/Cookies.md +0 -128
  78. package/node_modules/undici/docs/docs/api/Debug.md +0 -62
  79. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -315
  80. package/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1392
  81. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
  82. package/node_modules/undici/docs/docs/api/Errors.md +0 -49
  83. package/node_modules/undici/docs/docs/api/EventSource.md +0 -45
  84. package/node_modules/undici/docs/docs/api/Fetch.md +0 -60
  85. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -139
  86. package/node_modules/undici/docs/docs/api/H2CClient.md +0 -263
  87. package/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
  88. package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
  89. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
  90. package/node_modules/undici/docs/docs/api/MockClient.md +0 -81
  91. package/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
  92. package/node_modules/undici/docs/docs/api/MockPool.md +0 -555
  93. package/node_modules/undici/docs/docs/api/Pool.md +0 -84
  94. package/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
  95. package/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -229
  96. package/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -93
  97. package/node_modules/undici/docs/docs/api/RetryAgent.md +0 -50
  98. package/node_modules/undici/docs/docs/api/RetryHandler.md +0 -118
  99. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -145
  100. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -616
  101. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -275
  102. package/node_modules/undici/docs/docs/api/Util.md +0 -25
  103. package/node_modules/undici/docs/docs/api/WebSocket.md +0 -141
  104. package/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
  105. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
  106. package/node_modules/undici/docs/docs/best-practices/crawling.md +0 -58
  107. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
  108. package/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
  109. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +0 -224
  110. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -63
  111. package/node_modules/undici/index-fetch.js +0 -65
  112. package/node_modules/undici/index.d.ts +0 -3
  113. package/node_modules/undici/index.js +0 -234
  114. package/node_modules/undici/lib/api/abort-signal.js +0 -59
  115. package/node_modules/undici/lib/api/api-connect.js +0 -110
  116. package/node_modules/undici/lib/api/api-pipeline.js +0 -252
  117. package/node_modules/undici/lib/api/api-request.js +0 -214
  118. package/node_modules/undici/lib/api/api-stream.js +0 -209
  119. package/node_modules/undici/lib/api/api-upgrade.js +0 -111
  120. package/node_modules/undici/lib/api/index.js +0 -7
  121. package/node_modules/undici/lib/api/readable.js +0 -580
  122. package/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
  123. package/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
  124. package/node_modules/undici/lib/core/connect.js +0 -153
  125. package/node_modules/undici/lib/core/constants.js +0 -143
  126. package/node_modules/undici/lib/core/diagnostics.js +0 -227
  127. package/node_modules/undici/lib/core/errors.js +0 -477
  128. package/node_modules/undici/lib/core/request.js +0 -453
  129. package/node_modules/undici/lib/core/socks5-client.js +0 -422
  130. package/node_modules/undici/lib/core/socks5-utils.js +0 -212
  131. package/node_modules/undici/lib/core/symbols.js +0 -75
  132. package/node_modules/undici/lib/core/tree.js +0 -160
  133. package/node_modules/undici/lib/core/util.js +0 -992
  134. package/node_modules/undici/lib/dispatcher/agent.js +0 -158
  135. package/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -219
  136. package/node_modules/undici/lib/dispatcher/client-h1.js +0 -1722
  137. package/node_modules/undici/lib/dispatcher/client-h2.js +0 -995
  138. package/node_modules/undici/lib/dispatcher/client.js +0 -664
  139. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -184
  140. package/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
  141. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -146
  142. package/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -135
  143. package/node_modules/undici/lib/dispatcher/h2c-client.js +0 -51
  144. package/node_modules/undici/lib/dispatcher/pool-base.js +0 -214
  145. package/node_modules/undici/lib/dispatcher/pool.js +0 -118
  146. package/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -319
  147. package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
  148. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +0 -137
  149. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +0 -260
  150. package/node_modules/undici/lib/encoding/index.js +0 -33
  151. package/node_modules/undici/lib/global.js +0 -59
  152. package/node_modules/undici/lib/handler/cache-handler.js +0 -578
  153. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
  154. package/node_modules/undici/lib/handler/decorator-handler.js +0 -67
  155. package/node_modules/undici/lib/handler/deduplication-handler.js +0 -460
  156. package/node_modules/undici/lib/handler/redirect-handler.js +0 -238
  157. package/node_modules/undici/lib/handler/retry-handler.js +0 -394
  158. package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
  159. package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
  160. package/node_modules/undici/lib/interceptor/cache.js +0 -495
  161. package/node_modules/undici/lib/interceptor/decompress.js +0 -259
  162. package/node_modules/undici/lib/interceptor/deduplicate.js +0 -117
  163. package/node_modules/undici/lib/interceptor/dns.js +0 -571
  164. package/node_modules/undici/lib/interceptor/dump.js +0 -112
  165. package/node_modules/undici/lib/interceptor/redirect.js +0 -21
  166. package/node_modules/undici/lib/interceptor/response-error.js +0 -95
  167. package/node_modules/undici/lib/interceptor/retry.js +0 -19
  168. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  169. package/node_modules/undici/lib/llhttp/constants.d.ts +0 -195
  170. package/node_modules/undici/lib/llhttp/constants.js +0 -531
  171. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
  172. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
  173. package/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
  174. package/node_modules/undici/lib/llhttp/utils.js +0 -12
  175. package/node_modules/undici/lib/mock/mock-agent.js +0 -232
  176. package/node_modules/undici/lib/mock/mock-call-history.js +0 -248
  177. package/node_modules/undici/lib/mock/mock-client.js +0 -68
  178. package/node_modules/undici/lib/mock/mock-errors.js +0 -29
  179. package/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
  180. package/node_modules/undici/lib/mock/mock-pool.js +0 -68
  181. package/node_modules/undici/lib/mock/mock-symbols.js +0 -32
  182. package/node_modules/undici/lib/mock/mock-utils.js +0 -486
  183. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
  184. package/node_modules/undici/lib/mock/snapshot-agent.js +0 -353
  185. package/node_modules/undici/lib/mock/snapshot-recorder.js +0 -588
  186. package/node_modules/undici/lib/mock/snapshot-utils.js +0 -158
  187. package/node_modules/undici/lib/util/cache.js +0 -414
  188. package/node_modules/undici/lib/util/date.js +0 -653
  189. package/node_modules/undici/lib/util/promise.js +0 -28
  190. package/node_modules/undici/lib/util/runtime-features.js +0 -124
  191. package/node_modules/undici/lib/util/stats.js +0 -32
  192. package/node_modules/undici/lib/util/timers.js +0 -425
  193. package/node_modules/undici/lib/web/cache/cache.js +0 -864
  194. package/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
  195. package/node_modules/undici/lib/web/cache/util.js +0 -45
  196. package/node_modules/undici/lib/web/cookies/constants.js +0 -12
  197. package/node_modules/undici/lib/web/cookies/index.js +0 -199
  198. package/node_modules/undici/lib/web/cookies/parse.js +0 -314
  199. package/node_modules/undici/lib/web/cookies/util.js +0 -282
  200. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
  201. package/node_modules/undici/lib/web/eventsource/eventsource.js +0 -501
  202. package/node_modules/undici/lib/web/eventsource/util.js +0 -29
  203. package/node_modules/undici/lib/web/fetch/LICENSE +0 -21
  204. package/node_modules/undici/lib/web/fetch/body.js +0 -509
  205. package/node_modules/undici/lib/web/fetch/constants.js +0 -131
  206. package/node_modules/undici/lib/web/fetch/data-url.js +0 -596
  207. package/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -586
  208. package/node_modules/undici/lib/web/fetch/formdata.js +0 -259
  209. package/node_modules/undici/lib/web/fetch/global.js +0 -40
  210. package/node_modules/undici/lib/web/fetch/headers.js +0 -719
  211. package/node_modules/undici/lib/web/fetch/index.js +0 -2413
  212. package/node_modules/undici/lib/web/fetch/request.js +0 -1115
  213. package/node_modules/undici/lib/web/fetch/response.js +0 -641
  214. package/node_modules/undici/lib/web/fetch/util.js +0 -1522
  215. package/node_modules/undici/lib/web/infra/index.js +0 -229
  216. package/node_modules/undici/lib/web/subresource-integrity/Readme.md +0 -9
  217. package/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +0 -307
  218. package/node_modules/undici/lib/web/webidl/index.js +0 -1006
  219. package/node_modules/undici/lib/web/websocket/connection.js +0 -329
  220. package/node_modules/undici/lib/web/websocket/constants.js +0 -126
  221. package/node_modules/undici/lib/web/websocket/events.js +0 -331
  222. package/node_modules/undici/lib/web/websocket/frame.js +0 -133
  223. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -100
  224. package/node_modules/undici/lib/web/websocket/receiver.js +0 -507
  225. package/node_modules/undici/lib/web/websocket/sender.js +0 -109
  226. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -104
  227. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -498
  228. package/node_modules/undici/lib/web/websocket/util.js +0 -347
  229. package/node_modules/undici/lib/web/websocket/websocket.js +0 -758
  230. package/node_modules/undici/package.json +0 -152
  231. package/node_modules/undici/scripts/strip-comments.js +0 -10
  232. package/node_modules/undici/types/README.md +0 -6
  233. package/node_modules/undici/types/agent.d.ts +0 -32
  234. package/node_modules/undici/types/api.d.ts +0 -43
  235. package/node_modules/undici/types/balanced-pool.d.ts +0 -30
  236. package/node_modules/undici/types/cache-interceptor.d.ts +0 -179
  237. package/node_modules/undici/types/cache.d.ts +0 -36
  238. package/node_modules/undici/types/client-stats.d.ts +0 -15
  239. package/node_modules/undici/types/client.d.ts +0 -139
  240. package/node_modules/undici/types/connector.d.ts +0 -36
  241. package/node_modules/undici/types/content-type.d.ts +0 -21
  242. package/node_modules/undici/types/cookies.d.ts +0 -30
  243. package/node_modules/undici/types/diagnostics-channel.d.ts +0 -74
  244. package/node_modules/undici/types/dispatcher.d.ts +0 -275
  245. package/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -22
  246. package/node_modules/undici/types/errors.d.ts +0 -177
  247. package/node_modules/undici/types/eventsource.d.ts +0 -66
  248. package/node_modules/undici/types/fetch.d.ts +0 -231
  249. package/node_modules/undici/types/formdata.d.ts +0 -114
  250. package/node_modules/undici/types/global-dispatcher.d.ts +0 -9
  251. package/node_modules/undici/types/global-origin.d.ts +0 -7
  252. package/node_modules/undici/types/h2c-client.d.ts +0 -73
  253. package/node_modules/undici/types/handlers.d.ts +0 -14
  254. package/node_modules/undici/types/header.d.ts +0 -160
  255. package/node_modules/undici/types/index.d.ts +0 -91
  256. package/node_modules/undici/types/interceptors.d.ts +0 -80
  257. package/node_modules/undici/types/mock-agent.d.ts +0 -68
  258. package/node_modules/undici/types/mock-call-history.d.ts +0 -111
  259. package/node_modules/undici/types/mock-client.d.ts +0 -27
  260. package/node_modules/undici/types/mock-errors.d.ts +0 -12
  261. package/node_modules/undici/types/mock-interceptor.d.ts +0 -94
  262. package/node_modules/undici/types/mock-pool.d.ts +0 -27
  263. package/node_modules/undici/types/patch.d.ts +0 -29
  264. package/node_modules/undici/types/pool-stats.d.ts +0 -19
  265. package/node_modules/undici/types/pool.d.ts +0 -41
  266. package/node_modules/undici/types/proxy-agent.d.ts +0 -29
  267. package/node_modules/undici/types/readable.d.ts +0 -68
  268. package/node_modules/undici/types/retry-agent.d.ts +0 -8
  269. package/node_modules/undici/types/retry-handler.d.ts +0 -125
  270. package/node_modules/undici/types/round-robin-pool.d.ts +0 -41
  271. package/node_modules/undici/types/snapshot-agent.d.ts +0 -109
  272. package/node_modules/undici/types/socks5-proxy-agent.d.ts +0 -25
  273. package/node_modules/undici/types/util.d.ts +0 -18
  274. package/node_modules/undici/types/utility.d.ts +0 -7
  275. package/node_modules/undici/types/webidl.d.ts +0 -347
  276. package/node_modules/undici/types/websocket.d.ts +0 -188
@@ -1,259 +0,0 @@
1
- 'use strict'
2
-
3
- const { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')
4
- const { pipeline } = require('node:stream')
5
- const DecoratorHandler = require('../handler/decorator-handler')
6
- const { runtimeFeatures } = require('../util/runtime-features')
7
-
8
- /** @typedef {import('node:stream').Transform} Transform */
9
- /** @typedef {import('node:stream').Transform} Controller */
10
- /** @typedef {Transform&import('node:zlib').Zlib} DecompressorStream */
11
-
12
- /** @type {Record<string, () => DecompressorStream>} */
13
- const supportedEncodings = {
14
- gzip: createGunzip,
15
- 'x-gzip': createGunzip,
16
- br: createBrotliDecompress,
17
- deflate: createInflate,
18
- compress: createInflate,
19
- 'x-compress': createInflate,
20
- ...(runtimeFeatures.has('zstd') ? { zstd: createZstdDecompress } : {})
21
- }
22
-
23
- const defaultSkipStatusCodes = /** @type {const} */ ([204, 304])
24
-
25
- let warningEmitted = /** @type {boolean} */ (false)
26
-
27
- /**
28
- * @typedef {Object} DecompressHandlerOptions
29
- * @property {number[]|Readonly<number[]>} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for
30
- * @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)
31
- */
32
-
33
- class DecompressHandler extends DecoratorHandler {
34
- /** @type {Transform[]} */
35
- #decompressors = []
36
- /** @type {Readonly<number[]>} */
37
- #skipStatusCodes
38
- /** @type {boolean} */
39
- #skipErrorResponses
40
-
41
- constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {
42
- super(handler)
43
- this.#skipStatusCodes = skipStatusCodes
44
- this.#skipErrorResponses = skipErrorResponses
45
- }
46
-
47
- /**
48
- * Determines if decompression should be skipped based on encoding and status code
49
- * @param {string} contentEncoding - Content-Encoding header value
50
- * @param {number} statusCode - HTTP status code of the response
51
- * @returns {boolean} - True if decompression should be skipped
52
- */
53
- #shouldSkipDecompression (contentEncoding, statusCode) {
54
- if (!contentEncoding || statusCode < 200) return true
55
- if (this.#skipStatusCodes.includes(statusCode)) return true
56
- if (this.#skipErrorResponses && statusCode >= 400) return true
57
- return false
58
- }
59
-
60
- /**
61
- * Creates a chain of decompressors for multiple content encodings
62
- *
63
- * @param {string} encodings - Comma-separated list of content encodings
64
- * @returns {Array<DecompressorStream>} - Array of decompressor streams
65
- * @throws {Error} - If the number of content-encodings exceeds the maximum allowed
66
- */
67
- #createDecompressionChain (encodings) {
68
- const parts = encodings.split(',')
69
-
70
- // Limit the number of content-encodings to prevent resource exhaustion.
71
- // CVE fix similar to urllib3 (GHSA-gm62-xv2j-4w53) and curl (CVE-2022-32206).
72
- const maxContentEncodings = 5
73
- if (parts.length > maxContentEncodings) {
74
- throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`)
75
- }
76
-
77
- /** @type {DecompressorStream[]} */
78
- const decompressors = []
79
-
80
- for (let i = parts.length - 1; i >= 0; i--) {
81
- const encoding = parts[i].trim()
82
- if (!encoding) continue
83
-
84
- if (!supportedEncodings[encoding]) {
85
- decompressors.length = 0 // Clear if unsupported encoding
86
- return decompressors // Unsupported encoding
87
- }
88
-
89
- decompressors.push(supportedEncodings[encoding]())
90
- }
91
-
92
- return decompressors
93
- }
94
-
95
- /**
96
- * Sets up event handlers for a decompressor stream using readable events
97
- * @param {DecompressorStream} decompressor - The decompressor stream
98
- * @param {Controller} controller - The controller to coordinate with
99
- * @returns {void}
100
- */
101
- #setupDecompressorEvents (decompressor, controller) {
102
- decompressor.on('readable', () => {
103
- let chunk
104
- while ((chunk = decompressor.read()) !== null) {
105
- const result = super.onResponseData(controller, chunk)
106
- if (result === false) {
107
- break
108
- }
109
- }
110
- })
111
-
112
- decompressor.on('error', (error) => {
113
- super.onResponseError(controller, error)
114
- })
115
- }
116
-
117
- /**
118
- * Sets up event handling for a single decompressor
119
- * @param {Controller} controller - The controller to handle events
120
- * @returns {void}
121
- */
122
- #setupSingleDecompressor (controller) {
123
- const decompressor = this.#decompressors[0]
124
- this.#setupDecompressorEvents(decompressor, controller)
125
-
126
- decompressor.on('end', () => {
127
- super.onResponseEnd(controller, {})
128
- })
129
- }
130
-
131
- /**
132
- * Sets up event handling for multiple chained decompressors using pipeline
133
- * @param {Controller} controller - The controller to handle events
134
- * @returns {void}
135
- */
136
- #setupMultipleDecompressors (controller) {
137
- const lastDecompressor = this.#decompressors[this.#decompressors.length - 1]
138
- this.#setupDecompressorEvents(lastDecompressor, controller)
139
-
140
- pipeline(this.#decompressors, (err) => {
141
- if (err) {
142
- super.onResponseError(controller, err)
143
- return
144
- }
145
- super.onResponseEnd(controller, {})
146
- })
147
- }
148
-
149
- /**
150
- * Cleans up decompressor references to prevent memory leaks
151
- * @returns {void}
152
- */
153
- #cleanupDecompressors () {
154
- this.#decompressors.length = 0
155
- }
156
-
157
- /**
158
- * @param {Controller} controller
159
- * @param {number} statusCode
160
- * @param {Record<string, string | string[] | undefined>} headers
161
- * @param {string} statusMessage
162
- * @returns {void}
163
- */
164
- onResponseStart (controller, statusCode, headers, statusMessage) {
165
- const contentEncoding = headers['content-encoding']
166
-
167
- // If content encoding is not supported or status code is in skip list
168
- if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {
169
- return super.onResponseStart(controller, statusCode, headers, statusMessage)
170
- }
171
-
172
- const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase())
173
-
174
- if (decompressors.length === 0) {
175
- this.#cleanupDecompressors()
176
- return super.onResponseStart(controller, statusCode, headers, statusMessage)
177
- }
178
-
179
- this.#decompressors = decompressors
180
-
181
- // Remove compression headers since we're decompressing
182
- const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers
183
-
184
- if (this.#decompressors.length === 1) {
185
- this.#setupSingleDecompressor(controller)
186
- } else {
187
- this.#setupMultipleDecompressors(controller)
188
- }
189
-
190
- return super.onResponseStart(controller, statusCode, newHeaders, statusMessage)
191
- }
192
-
193
- /**
194
- * @param {Controller} controller
195
- * @param {Buffer} chunk
196
- * @returns {void}
197
- */
198
- onResponseData (controller, chunk) {
199
- if (this.#decompressors.length > 0) {
200
- this.#decompressors[0].write(chunk)
201
- return
202
- }
203
- super.onResponseData(controller, chunk)
204
- }
205
-
206
- /**
207
- * @param {Controller} controller
208
- * @param {Record<string, string | string[]> | undefined} trailers
209
- * @returns {void}
210
- */
211
- onResponseEnd (controller, trailers) {
212
- if (this.#decompressors.length > 0) {
213
- this.#decompressors[0].end()
214
- this.#cleanupDecompressors()
215
- return
216
- }
217
- super.onResponseEnd(controller, trailers)
218
- }
219
-
220
- /**
221
- * @param {Controller} controller
222
- * @param {Error} err
223
- * @returns {void}
224
- */
225
- onResponseError (controller, err) {
226
- if (this.#decompressors.length > 0) {
227
- for (const decompressor of this.#decompressors) {
228
- decompressor.destroy(err)
229
- }
230
- this.#cleanupDecompressors()
231
- }
232
- super.onResponseError(controller, err)
233
- }
234
- }
235
-
236
- /**
237
- * Creates a decompression interceptor for HTTP responses
238
- * @param {DecompressHandlerOptions} [options] - Options for the interceptor
239
- * @returns {Function} - Interceptor function
240
- */
241
- function createDecompressInterceptor (options = {}) {
242
- // Emit experimental warning only once
243
- if (!warningEmitted) {
244
- process.emitWarning(
245
- 'DecompressInterceptor is experimental and subject to change',
246
- 'ExperimentalWarning'
247
- )
248
- warningEmitted = true
249
- }
250
-
251
- return (dispatch) => {
252
- return (opts, handler) => {
253
- const decompressHandler = new DecompressHandler(handler, options)
254
- return dispatch(opts, decompressHandler)
255
- }
256
- }
257
- }
258
-
259
- module.exports = createDecompressInterceptor
@@ -1,117 +0,0 @@
1
- 'use strict'
2
-
3
- const diagnosticsChannel = require('node:diagnostics_channel')
4
- const util = require('../core/util')
5
- const DeduplicationHandler = require('../handler/deduplication-handler')
6
- const { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = require('../util/cache.js')
7
-
8
- const pendingRequestsChannel = diagnosticsChannel.channel('undici:request:pending-requests')
9
-
10
- /**
11
- * @param {import('../../types/interceptors.d.ts').default.DeduplicateInterceptorOpts} [opts]
12
- * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor}
13
- */
14
- module.exports = (opts = {}) => {
15
- const {
16
- methods = ['GET'],
17
- skipHeaderNames = [],
18
- excludeHeaderNames = [],
19
- maxBufferSize = 5 * 1024 * 1024
20
- } = opts
21
-
22
- if (typeof opts !== 'object' || opts === null) {
23
- throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`)
24
- }
25
-
26
- if (!Array.isArray(methods)) {
27
- throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`)
28
- }
29
-
30
- for (const method of methods) {
31
- if (!util.safeHTTPMethods.includes(method)) {
32
- throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`)
33
- }
34
- }
35
-
36
- if (!Array.isArray(skipHeaderNames)) {
37
- throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`)
38
- }
39
-
40
- if (!Array.isArray(excludeHeaderNames)) {
41
- throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)
42
- }
43
-
44
- if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {
45
- throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)
46
- }
47
-
48
- // Convert to lowercase Set for case-insensitive header matching
49
- const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()))
50
-
51
- // Convert to lowercase Set for case-insensitive header exclusion from deduplication key
52
- const excludeHeaderNamesSet = new Set(excludeHeaderNames.map(name => name.toLowerCase()))
53
-
54
- /**
55
- * Map of pending requests for deduplication
56
- * @type {Map<string, DeduplicationHandler>}
57
- */
58
- const pendingRequests = new Map()
59
-
60
- return dispatch => {
61
- return (opts, handler) => {
62
- if (!opts.origin || methods.includes(opts.method) === false) {
63
- return dispatch(opts, handler)
64
- }
65
-
66
- opts = {
67
- ...opts,
68
- headers: normalizeHeaders(opts)
69
- }
70
-
71
- // Skip deduplication if request contains any of the specified headers
72
- if (skipHeaderNamesSet.size > 0) {
73
- for (const headerName of Object.keys(opts.headers)) {
74
- if (skipHeaderNamesSet.has(headerName.toLowerCase())) {
75
- return dispatch(opts, handler)
76
- }
77
- }
78
- }
79
-
80
- const cacheKey = makeCacheKey(opts)
81
- const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet)
82
-
83
- // Check if there's already a pending request for this key
84
- const pendingHandler = pendingRequests.get(dedupeKey)
85
- if (pendingHandler) {
86
- // Add this handler to the waiting list when safe.
87
- // If body streaming has already started, this request must be sent independently.
88
- if (pendingHandler.addWaitingHandler(handler)) {
89
- return true
90
- }
91
-
92
- return dispatch(opts, handler)
93
- }
94
-
95
- // Create a new deduplication handler
96
- const deduplicationHandler = new DeduplicationHandler(
97
- handler,
98
- () => {
99
- // Clean up when request completes
100
- pendingRequests.delete(dedupeKey)
101
- if (pendingRequestsChannel.hasSubscribers) {
102
- pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' })
103
- }
104
- },
105
- maxBufferSize
106
- )
107
-
108
- // Register the pending request
109
- pendingRequests.set(dedupeKey, deduplicationHandler)
110
- if (pendingRequestsChannel.hasSubscribers) {
111
- pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'added' })
112
- }
113
-
114
- return dispatch(opts, deduplicationHandler)
115
- }
116
- }
117
- }