pi-cursor-sdk 0.1.50 → 0.1.52

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 (279) hide show
  1. package/CHANGELOG.md +31 -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-provider-turn-runner.ts +1 -1
  12. package/src/cursor-provider.ts +9 -2
  13. package/src/cursor-session-turn-queue.ts +52 -0
  14. package/src/cursor-tool-manifest.ts +1 -1
  15. package/node_modules/@connectrpc/connect-node/README.md +0 -141
  16. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.d.ts +0 -15
  17. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.js +0 -89
  18. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.d.ts +0 -42
  19. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.js +0 -61
  20. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.d.ts +0 -100
  21. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.js +0 -25
  22. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.d.ts +0 -96
  23. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.js +0 -25
  24. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.d.ts +0 -96
  25. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.js +0 -25
  26. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.d.ts +0 -146
  27. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.js +0 -536
  28. package/node_modules/@connectrpc/connect-node/dist/cjs/index.d.ts +0 -15
  29. package/node_modules/@connectrpc/connect-node/dist/cjs/index.js +0 -36
  30. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.d.ts +0 -45
  31. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.js +0 -154
  32. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.d.ts +0 -1
  33. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.js +0 -29
  34. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.d.ts +0 -89
  35. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.js +0 -58
  36. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.d.ts +0 -54
  37. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.js +0 -326
  38. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.d.ts +0 -41
  39. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.js +0 -234
  40. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.d.ts +0 -19
  41. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.js +0 -97
  42. package/node_modules/@connectrpc/connect-node/dist/cjs/package.json +0 -1
  43. package/node_modules/@connectrpc/connect-node/dist/esm/compression.d.ts +0 -15
  44. package/node_modules/@connectrpc/connect-node/dist/esm/compression.js +0 -86
  45. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.d.ts +0 -42
  46. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.js +0 -58
  47. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.d.ts +0 -100
  48. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.js +0 -22
  49. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.d.ts +0 -96
  50. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.js +0 -22
  51. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.d.ts +0 -96
  52. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.js +0 -22
  53. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.d.ts +0 -146
  54. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.js +0 -532
  55. package/node_modules/@connectrpc/connect-node/dist/esm/index.d.ts +0 -15
  56. package/node_modules/@connectrpc/connect-node/dist/esm/index.js +0 -23
  57. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.d.ts +0 -45
  58. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.js +0 -147
  59. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.d.ts +0 -1
  60. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.js +0 -27
  61. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.d.ts +0 -89
  62. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.js +0 -58
  63. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.d.ts +0 -54
  64. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.js +0 -324
  65. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.d.ts +0 -41
  66. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.js +0 -230
  67. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.d.ts +0 -19
  68. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.js +0 -93
  69. package/node_modules/@connectrpc/connect-node/package.json +0 -46
  70. package/node_modules/undici/LICENSE +0 -21
  71. package/node_modules/undici/README.md +0 -741
  72. package/node_modules/undici/docs/docs/api/Agent.md +0 -84
  73. package/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
  74. package/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
  75. package/node_modules/undici/docs/docs/api/CacheStore.md +0 -164
  76. package/node_modules/undici/docs/docs/api/Client.md +0 -288
  77. package/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
  78. package/node_modules/undici/docs/docs/api/Connector.md +0 -115
  79. package/node_modules/undici/docs/docs/api/ContentType.md +0 -57
  80. package/node_modules/undici/docs/docs/api/Cookies.md +0 -128
  81. package/node_modules/undici/docs/docs/api/Debug.md +0 -62
  82. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -315
  83. package/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1392
  84. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
  85. package/node_modules/undici/docs/docs/api/Errors.md +0 -49
  86. package/node_modules/undici/docs/docs/api/EventSource.md +0 -45
  87. package/node_modules/undici/docs/docs/api/Fetch.md +0 -60
  88. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -139
  89. package/node_modules/undici/docs/docs/api/H2CClient.md +0 -263
  90. package/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
  91. package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
  92. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
  93. package/node_modules/undici/docs/docs/api/MockClient.md +0 -81
  94. package/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
  95. package/node_modules/undici/docs/docs/api/MockPool.md +0 -555
  96. package/node_modules/undici/docs/docs/api/Pool.md +0 -84
  97. package/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
  98. package/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -229
  99. package/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -93
  100. package/node_modules/undici/docs/docs/api/RetryAgent.md +0 -50
  101. package/node_modules/undici/docs/docs/api/RetryHandler.md +0 -118
  102. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -145
  103. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -616
  104. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -275
  105. package/node_modules/undici/docs/docs/api/Util.md +0 -25
  106. package/node_modules/undici/docs/docs/api/WebSocket.md +0 -141
  107. package/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
  108. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
  109. package/node_modules/undici/docs/docs/best-practices/crawling.md +0 -58
  110. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
  111. package/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
  112. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +0 -224
  113. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -63
  114. package/node_modules/undici/index-fetch.js +0 -65
  115. package/node_modules/undici/index.d.ts +0 -3
  116. package/node_modules/undici/index.js +0 -234
  117. package/node_modules/undici/lib/api/abort-signal.js +0 -59
  118. package/node_modules/undici/lib/api/api-connect.js +0 -110
  119. package/node_modules/undici/lib/api/api-pipeline.js +0 -252
  120. package/node_modules/undici/lib/api/api-request.js +0 -214
  121. package/node_modules/undici/lib/api/api-stream.js +0 -209
  122. package/node_modules/undici/lib/api/api-upgrade.js +0 -111
  123. package/node_modules/undici/lib/api/index.js +0 -7
  124. package/node_modules/undici/lib/api/readable.js +0 -580
  125. package/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
  126. package/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
  127. package/node_modules/undici/lib/core/connect.js +0 -153
  128. package/node_modules/undici/lib/core/constants.js +0 -143
  129. package/node_modules/undici/lib/core/diagnostics.js +0 -227
  130. package/node_modules/undici/lib/core/errors.js +0 -477
  131. package/node_modules/undici/lib/core/request.js +0 -453
  132. package/node_modules/undici/lib/core/socks5-client.js +0 -422
  133. package/node_modules/undici/lib/core/socks5-utils.js +0 -212
  134. package/node_modules/undici/lib/core/symbols.js +0 -75
  135. package/node_modules/undici/lib/core/tree.js +0 -160
  136. package/node_modules/undici/lib/core/util.js +0 -992
  137. package/node_modules/undici/lib/dispatcher/agent.js +0 -158
  138. package/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -219
  139. package/node_modules/undici/lib/dispatcher/client-h1.js +0 -1722
  140. package/node_modules/undici/lib/dispatcher/client-h2.js +0 -995
  141. package/node_modules/undici/lib/dispatcher/client.js +0 -664
  142. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -184
  143. package/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
  144. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -146
  145. package/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -135
  146. package/node_modules/undici/lib/dispatcher/h2c-client.js +0 -51
  147. package/node_modules/undici/lib/dispatcher/pool-base.js +0 -214
  148. package/node_modules/undici/lib/dispatcher/pool.js +0 -118
  149. package/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -319
  150. package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
  151. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +0 -137
  152. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +0 -260
  153. package/node_modules/undici/lib/encoding/index.js +0 -33
  154. package/node_modules/undici/lib/global.js +0 -59
  155. package/node_modules/undici/lib/handler/cache-handler.js +0 -578
  156. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
  157. package/node_modules/undici/lib/handler/decorator-handler.js +0 -67
  158. package/node_modules/undici/lib/handler/deduplication-handler.js +0 -460
  159. package/node_modules/undici/lib/handler/redirect-handler.js +0 -238
  160. package/node_modules/undici/lib/handler/retry-handler.js +0 -394
  161. package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
  162. package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
  163. package/node_modules/undici/lib/interceptor/cache.js +0 -495
  164. package/node_modules/undici/lib/interceptor/decompress.js +0 -259
  165. package/node_modules/undici/lib/interceptor/deduplicate.js +0 -117
  166. package/node_modules/undici/lib/interceptor/dns.js +0 -571
  167. package/node_modules/undici/lib/interceptor/dump.js +0 -112
  168. package/node_modules/undici/lib/interceptor/redirect.js +0 -21
  169. package/node_modules/undici/lib/interceptor/response-error.js +0 -95
  170. package/node_modules/undici/lib/interceptor/retry.js +0 -19
  171. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  172. package/node_modules/undici/lib/llhttp/constants.d.ts +0 -195
  173. package/node_modules/undici/lib/llhttp/constants.js +0 -531
  174. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
  175. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
  176. package/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
  177. package/node_modules/undici/lib/llhttp/utils.js +0 -12
  178. package/node_modules/undici/lib/mock/mock-agent.js +0 -232
  179. package/node_modules/undici/lib/mock/mock-call-history.js +0 -248
  180. package/node_modules/undici/lib/mock/mock-client.js +0 -68
  181. package/node_modules/undici/lib/mock/mock-errors.js +0 -29
  182. package/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
  183. package/node_modules/undici/lib/mock/mock-pool.js +0 -68
  184. package/node_modules/undici/lib/mock/mock-symbols.js +0 -32
  185. package/node_modules/undici/lib/mock/mock-utils.js +0 -486
  186. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
  187. package/node_modules/undici/lib/mock/snapshot-agent.js +0 -353
  188. package/node_modules/undici/lib/mock/snapshot-recorder.js +0 -588
  189. package/node_modules/undici/lib/mock/snapshot-utils.js +0 -158
  190. package/node_modules/undici/lib/util/cache.js +0 -414
  191. package/node_modules/undici/lib/util/date.js +0 -653
  192. package/node_modules/undici/lib/util/promise.js +0 -28
  193. package/node_modules/undici/lib/util/runtime-features.js +0 -124
  194. package/node_modules/undici/lib/util/stats.js +0 -32
  195. package/node_modules/undici/lib/util/timers.js +0 -425
  196. package/node_modules/undici/lib/web/cache/cache.js +0 -864
  197. package/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
  198. package/node_modules/undici/lib/web/cache/util.js +0 -45
  199. package/node_modules/undici/lib/web/cookies/constants.js +0 -12
  200. package/node_modules/undici/lib/web/cookies/index.js +0 -199
  201. package/node_modules/undici/lib/web/cookies/parse.js +0 -314
  202. package/node_modules/undici/lib/web/cookies/util.js +0 -282
  203. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
  204. package/node_modules/undici/lib/web/eventsource/eventsource.js +0 -501
  205. package/node_modules/undici/lib/web/eventsource/util.js +0 -29
  206. package/node_modules/undici/lib/web/fetch/LICENSE +0 -21
  207. package/node_modules/undici/lib/web/fetch/body.js +0 -509
  208. package/node_modules/undici/lib/web/fetch/constants.js +0 -131
  209. package/node_modules/undici/lib/web/fetch/data-url.js +0 -596
  210. package/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -586
  211. package/node_modules/undici/lib/web/fetch/formdata.js +0 -259
  212. package/node_modules/undici/lib/web/fetch/global.js +0 -40
  213. package/node_modules/undici/lib/web/fetch/headers.js +0 -719
  214. package/node_modules/undici/lib/web/fetch/index.js +0 -2413
  215. package/node_modules/undici/lib/web/fetch/request.js +0 -1115
  216. package/node_modules/undici/lib/web/fetch/response.js +0 -641
  217. package/node_modules/undici/lib/web/fetch/util.js +0 -1522
  218. package/node_modules/undici/lib/web/infra/index.js +0 -229
  219. package/node_modules/undici/lib/web/subresource-integrity/Readme.md +0 -9
  220. package/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +0 -307
  221. package/node_modules/undici/lib/web/webidl/index.js +0 -1006
  222. package/node_modules/undici/lib/web/websocket/connection.js +0 -329
  223. package/node_modules/undici/lib/web/websocket/constants.js +0 -126
  224. package/node_modules/undici/lib/web/websocket/events.js +0 -331
  225. package/node_modules/undici/lib/web/websocket/frame.js +0 -133
  226. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -100
  227. package/node_modules/undici/lib/web/websocket/receiver.js +0 -507
  228. package/node_modules/undici/lib/web/websocket/sender.js +0 -109
  229. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -104
  230. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -498
  231. package/node_modules/undici/lib/web/websocket/util.js +0 -347
  232. package/node_modules/undici/lib/web/websocket/websocket.js +0 -758
  233. package/node_modules/undici/package.json +0 -152
  234. package/node_modules/undici/scripts/strip-comments.js +0 -10
  235. package/node_modules/undici/types/README.md +0 -6
  236. package/node_modules/undici/types/agent.d.ts +0 -32
  237. package/node_modules/undici/types/api.d.ts +0 -43
  238. package/node_modules/undici/types/balanced-pool.d.ts +0 -30
  239. package/node_modules/undici/types/cache-interceptor.d.ts +0 -179
  240. package/node_modules/undici/types/cache.d.ts +0 -36
  241. package/node_modules/undici/types/client-stats.d.ts +0 -15
  242. package/node_modules/undici/types/client.d.ts +0 -139
  243. package/node_modules/undici/types/connector.d.ts +0 -36
  244. package/node_modules/undici/types/content-type.d.ts +0 -21
  245. package/node_modules/undici/types/cookies.d.ts +0 -30
  246. package/node_modules/undici/types/diagnostics-channel.d.ts +0 -74
  247. package/node_modules/undici/types/dispatcher.d.ts +0 -275
  248. package/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -22
  249. package/node_modules/undici/types/errors.d.ts +0 -177
  250. package/node_modules/undici/types/eventsource.d.ts +0 -66
  251. package/node_modules/undici/types/fetch.d.ts +0 -231
  252. package/node_modules/undici/types/formdata.d.ts +0 -114
  253. package/node_modules/undici/types/global-dispatcher.d.ts +0 -9
  254. package/node_modules/undici/types/global-origin.d.ts +0 -7
  255. package/node_modules/undici/types/h2c-client.d.ts +0 -73
  256. package/node_modules/undici/types/handlers.d.ts +0 -14
  257. package/node_modules/undici/types/header.d.ts +0 -160
  258. package/node_modules/undici/types/index.d.ts +0 -91
  259. package/node_modules/undici/types/interceptors.d.ts +0 -80
  260. package/node_modules/undici/types/mock-agent.d.ts +0 -68
  261. package/node_modules/undici/types/mock-call-history.d.ts +0 -111
  262. package/node_modules/undici/types/mock-client.d.ts +0 -27
  263. package/node_modules/undici/types/mock-errors.d.ts +0 -12
  264. package/node_modules/undici/types/mock-interceptor.d.ts +0 -94
  265. package/node_modules/undici/types/mock-pool.d.ts +0 -27
  266. package/node_modules/undici/types/patch.d.ts +0 -29
  267. package/node_modules/undici/types/pool-stats.d.ts +0 -19
  268. package/node_modules/undici/types/pool.d.ts +0 -41
  269. package/node_modules/undici/types/proxy-agent.d.ts +0 -29
  270. package/node_modules/undici/types/readable.d.ts +0 -68
  271. package/node_modules/undici/types/retry-agent.d.ts +0 -8
  272. package/node_modules/undici/types/retry-handler.d.ts +0 -125
  273. package/node_modules/undici/types/round-robin-pool.d.ts +0 -41
  274. package/node_modules/undici/types/snapshot-agent.d.ts +0 -109
  275. package/node_modules/undici/types/socks5-proxy-agent.d.ts +0 -25
  276. package/node_modules/undici/types/util.d.ts +0 -18
  277. package/node_modules/undici/types/utility.d.ts +0 -7
  278. package/node_modules/undici/types/webidl.d.ts +0 -347
  279. package/node_modules/undici/types/websocket.d.ts +0 -188
@@ -1,719 +0,0 @@
1
- // https://github.com/Ethan-Arrowood/undici-fetch
2
-
3
- 'use strict'
4
-
5
- const { kConstruct } = require('../../core/symbols')
6
- const { kEnumerableProperty } = require('../../core/util')
7
- const {
8
- iteratorMixin,
9
- isValidHeaderName,
10
- isValidHeaderValue
11
- } = require('./util')
12
- const { webidl } = require('../webidl')
13
- const assert = require('node:assert')
14
- const util = require('node:util')
15
-
16
- /**
17
- * @param {number} code
18
- * @returns {code is (0x0a | 0x0d | 0x09 | 0x20)}
19
- */
20
- function isHTTPWhiteSpaceCharCode (code) {
21
- return code === 0x0a || code === 0x0d || code === 0x09 || code === 0x20
22
- }
23
-
24
- /**
25
- * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
26
- * @param {string} potentialValue
27
- * @returns {string}
28
- */
29
- function headerValueNormalize (potentialValue) {
30
- // To normalize a byte sequence potentialValue, remove
31
- // any leading and trailing HTTP whitespace bytes from
32
- // potentialValue.
33
- let i = 0; let j = potentialValue.length
34
-
35
- while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j
36
- while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i
37
-
38
- return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
39
- }
40
-
41
- /**
42
- * @param {Headers} headers
43
- * @param {Array|Object} object
44
- */
45
- function fill (headers, object) {
46
- // To fill a Headers object headers with a given object object, run these steps:
47
-
48
- // 1. If object is a sequence, then for each header in object:
49
- // Note: webidl conversion to array has already been done.
50
- if (Array.isArray(object)) {
51
- for (let i = 0; i < object.length; ++i) {
52
- const header = object[i]
53
- // 1. If header does not contain exactly two items, then throw a TypeError.
54
- if (header.length !== 2) {
55
- throw webidl.errors.exception({
56
- header: 'Headers constructor',
57
- message: `expected name/value pair to be length 2, found ${header.length}.`
58
- })
59
- }
60
-
61
- // 2. Append (header’s first item, header’s second item) to headers.
62
- appendHeader(headers, header[0], header[1])
63
- }
64
- } else if (typeof object === 'object' && object !== null) {
65
- // Note: null should throw
66
-
67
- // 2. Otherwise, object is a record, then for each key → value in object,
68
- // append (key, value) to headers
69
- const keys = Object.keys(object)
70
- for (let i = 0; i < keys.length; ++i) {
71
- appendHeader(headers, keys[i], object[keys[i]])
72
- }
73
- } else {
74
- throw webidl.errors.conversionFailed({
75
- prefix: 'Headers constructor',
76
- argument: 'Argument 1',
77
- types: ['sequence<sequence<ByteString>>', 'record<ByteString, ByteString>']
78
- })
79
- }
80
- }
81
-
82
- /**
83
- * @see https://fetch.spec.whatwg.org/#concept-headers-append
84
- * @param {Headers} headers
85
- * @param {string} name
86
- * @param {string} value
87
- */
88
- function appendHeader (headers, name, value) {
89
- // 1. Normalize value.
90
- value = headerValueNormalize(value)
91
-
92
- // 2. If name is not a header name or value is not a
93
- // header value, then throw a TypeError.
94
- if (!isValidHeaderName(name)) {
95
- throw webidl.errors.invalidArgument({
96
- prefix: 'Headers.append',
97
- value: name,
98
- type: 'header name'
99
- })
100
- } else if (!isValidHeaderValue(value)) {
101
- throw webidl.errors.invalidArgument({
102
- prefix: 'Headers.append',
103
- value,
104
- type: 'header value'
105
- })
106
- }
107
-
108
- // 3. If headers’s guard is "immutable", then throw a TypeError.
109
- // 4. Otherwise, if headers’s guard is "request" and name is a
110
- // forbidden header name, return.
111
- // 5. Otherwise, if headers’s guard is "request-no-cors":
112
- // TODO
113
- // Note: undici does not implement forbidden header names
114
- if (getHeadersGuard(headers) === 'immutable') {
115
- throw new TypeError('immutable')
116
- }
117
-
118
- // 6. Otherwise, if headers’s guard is "response" and name is a
119
- // forbidden response-header name, return.
120
-
121
- // 7. Append (name, value) to headers’s header list.
122
- return getHeadersList(headers).append(name, value, false)
123
-
124
- // 8. If headers’s guard is "request-no-cors", then remove
125
- // privileged no-CORS request headers from headers
126
- }
127
-
128
- // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
129
- /**
130
- * @param {Headers} target
131
- */
132
- function headersListSortAndCombine (target) {
133
- const headersList = getHeadersList(target)
134
-
135
- if (!headersList) {
136
- return []
137
- }
138
-
139
- if (headersList.sortedMap) {
140
- return headersList.sortedMap
141
- }
142
-
143
- // 1. Let headers be an empty list of headers with the key being the name
144
- // and value the value.
145
- const headers = []
146
-
147
- // 2. Let names be the result of convert header names to a sorted-lowercase
148
- // set with all the names of the headers in list.
149
- const names = headersList.toSortedArray()
150
-
151
- const cookies = headersList.cookies
152
-
153
- // fast-path
154
- if (cookies === null || cookies.length === 1) {
155
- // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray`
156
- return (headersList.sortedMap = names)
157
- }
158
-
159
- // 3. For each name of names:
160
- for (let i = 0; i < names.length; ++i) {
161
- const { 0: name, 1: value } = names[i]
162
- // 1. If name is `set-cookie`, then:
163
- if (name === 'set-cookie') {
164
- // 1. Let values be a list of all values of headers in list whose name
165
- // is a byte-case-insensitive match for name, in order.
166
-
167
- // 2. For each value of values:
168
- // 1. Append (name, value) to headers.
169
- for (let j = 0; j < cookies.length; ++j) {
170
- headers.push([name, cookies[j]])
171
- }
172
- } else {
173
- // 2. Otherwise:
174
-
175
- // 1. Let value be the result of getting name from list.
176
-
177
- // 2. Assert: value is non-null.
178
- // Note: This operation was done by `HeadersList#toSortedArray`.
179
-
180
- // 3. Append (name, value) to headers.
181
- headers.push([name, value])
182
- }
183
- }
184
-
185
- // 4. Return headers.
186
- return (headersList.sortedMap = headers)
187
- }
188
-
189
- function compareHeaderName (a, b) {
190
- return a[0] < b[0] ? -1 : 1
191
- }
192
-
193
- class HeadersList {
194
- /** @type {[string, string][]|null} */
195
- cookies = null
196
-
197
- sortedMap
198
- headersMap
199
-
200
- constructor (init) {
201
- if (init instanceof HeadersList) {
202
- this.headersMap = new Map(init.headersMap)
203
- this.sortedMap = init.sortedMap
204
- this.cookies = init.cookies === null ? null : [...init.cookies]
205
- } else {
206
- this.headersMap = new Map(init)
207
- this.sortedMap = null
208
- }
209
- }
210
-
211
- /**
212
- * @see https://fetch.spec.whatwg.org/#header-list-contains
213
- * @param {string} name
214
- * @param {boolean} isLowerCase
215
- */
216
- contains (name, isLowerCase) {
217
- // A header list list contains a header name name if list
218
- // contains a header whose name is a byte-case-insensitive
219
- // match for name.
220
-
221
- return this.headersMap.has(isLowerCase ? name : name.toLowerCase())
222
- }
223
-
224
- clear () {
225
- this.headersMap.clear()
226
- this.sortedMap = null
227
- this.cookies = null
228
- }
229
-
230
- /**
231
- * @see https://fetch.spec.whatwg.org/#concept-header-list-append
232
- * @param {string} name
233
- * @param {string} value
234
- * @param {boolean} isLowerCase
235
- */
236
- append (name, value, isLowerCase) {
237
- this.sortedMap = null
238
-
239
- // 1. If list contains name, then set name to the first such
240
- // header’s name.
241
- const lowercaseName = isLowerCase ? name : name.toLowerCase()
242
- const exists = this.headersMap.get(lowercaseName)
243
-
244
- // 2. Append (name, value) to list.
245
- if (exists) {
246
- const delimiter = lowercaseName === 'cookie' ? '; ' : ', '
247
- this.headersMap.set(lowercaseName, {
248
- name: exists.name,
249
- value: `${exists.value}${delimiter}${value}`
250
- })
251
- } else {
252
- this.headersMap.set(lowercaseName, { name, value })
253
- }
254
-
255
- if (lowercaseName === 'set-cookie') {
256
- (this.cookies ??= []).push(value)
257
- }
258
- }
259
-
260
- /**
261
- * @see https://fetch.spec.whatwg.org/#concept-header-list-set
262
- * @param {string} name
263
- * @param {string} value
264
- * @param {boolean} isLowerCase
265
- */
266
- set (name, value, isLowerCase) {
267
- this.sortedMap = null
268
- const lowercaseName = isLowerCase ? name : name.toLowerCase()
269
-
270
- if (lowercaseName === 'set-cookie') {
271
- this.cookies = [value]
272
- }
273
-
274
- // 1. If list contains name, then set the value of
275
- // the first such header to value and remove the
276
- // others.
277
- // 2. Otherwise, append header (name, value) to list.
278
- this.headersMap.set(lowercaseName, { name, value })
279
- }
280
-
281
- /**
282
- * @see https://fetch.spec.whatwg.org/#concept-header-list-delete
283
- * @param {string} name
284
- * @param {boolean} isLowerCase
285
- */
286
- delete (name, isLowerCase) {
287
- this.sortedMap = null
288
- if (!isLowerCase) name = name.toLowerCase()
289
-
290
- if (name === 'set-cookie') {
291
- this.cookies = null
292
- }
293
-
294
- this.headersMap.delete(name)
295
- }
296
-
297
- /**
298
- * @see https://fetch.spec.whatwg.org/#concept-header-list-get
299
- * @param {string} name
300
- * @param {boolean} isLowerCase
301
- * @returns {string | null}
302
- */
303
- get (name, isLowerCase) {
304
- // 1. If list does not contain name, then return null.
305
- // 2. Return the values of all headers in list whose name
306
- // is a byte-case-insensitive match for name,
307
- // separated from each other by 0x2C 0x20, in order.
308
- return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null
309
- }
310
-
311
- * [Symbol.iterator] () {
312
- // use the lowercased name
313
- for (const { 0: name, 1: { value } } of this.headersMap) {
314
- yield [name, value]
315
- }
316
- }
317
-
318
- get entries () {
319
- const headers = {}
320
-
321
- if (this.headersMap.size !== 0) {
322
- for (const { name, value } of this.headersMap.values()) {
323
- headers[name] = value
324
- }
325
- }
326
-
327
- return headers
328
- }
329
-
330
- rawValues () {
331
- return this.headersMap.values()
332
- }
333
-
334
- get entriesList () {
335
- const headers = []
336
-
337
- if (this.headersMap.size !== 0) {
338
- for (const { 0: lowerName, 1: { name, value } } of this.headersMap) {
339
- if (lowerName === 'set-cookie') {
340
- for (const cookie of this.cookies) {
341
- headers.push([name, cookie])
342
- }
343
- } else {
344
- headers.push([name, value])
345
- }
346
- }
347
- }
348
-
349
- return headers
350
- }
351
-
352
- // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set
353
- toSortedArray () {
354
- const size = this.headersMap.size
355
- const array = new Array(size)
356
- // In most cases, you will use the fast-path.
357
- // fast-path: Use binary insertion sort for small arrays.
358
- if (size <= 32) {
359
- if (size === 0) {
360
- // If empty, it is an empty array. To avoid the first index assignment.
361
- return array
362
- }
363
- // Improve performance by unrolling loop and avoiding double-loop.
364
- // Double-loop-less version of the binary insertion sort.
365
- const iterator = this.headersMap[Symbol.iterator]()
366
- const firstValue = iterator.next().value
367
- // set [name, value] to first index.
368
- array[0] = [firstValue[0], firstValue[1].value]
369
- // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
370
- // 3.2.2. Assert: value is non-null.
371
- assert(firstValue[1].value !== null)
372
- for (
373
- let i = 1, j = 0, right = 0, left = 0, pivot = 0, x, value;
374
- i < size;
375
- ++i
376
- ) {
377
- // get next value
378
- value = iterator.next().value
379
- // set [name, value] to current index.
380
- x = array[i] = [value[0], value[1].value]
381
- // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
382
- // 3.2.2. Assert: value is non-null.
383
- assert(x[1] !== null)
384
- left = 0
385
- right = i
386
- // binary search
387
- while (left < right) {
388
- // middle index
389
- pivot = left + ((right - left) >> 1)
390
- // compare header name
391
- if (array[pivot][0] <= x[0]) {
392
- left = pivot + 1
393
- } else {
394
- right = pivot
395
- }
396
- }
397
- if (i !== pivot) {
398
- j = i
399
- while (j > left) {
400
- array[j] = array[--j]
401
- }
402
- array[left] = x
403
- }
404
- }
405
- /* c8 ignore next 4 */
406
- if (!iterator.next().done) {
407
- // This is for debugging and will never be called.
408
- throw new TypeError('Unreachable')
409
- }
410
- return array
411
- } else {
412
- // This case would be a rare occurrence.
413
- // slow-path: fallback
414
- let i = 0
415
- for (const { 0: name, 1: { value } } of this.headersMap) {
416
- array[i++] = [name, value]
417
- // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
418
- // 3.2.2. Assert: value is non-null.
419
- assert(value !== null)
420
- }
421
- return array.sort(compareHeaderName)
422
- }
423
- }
424
- }
425
-
426
- // https://fetch.spec.whatwg.org/#headers-class
427
- class Headers {
428
- #guard
429
- /**
430
- * @type {HeadersList}
431
- */
432
- #headersList
433
-
434
- /**
435
- * @param {HeadersInit|Symbol} [init]
436
- * @returns
437
- */
438
- constructor (init = undefined) {
439
- webidl.util.markAsUncloneable(this)
440
-
441
- if (init === kConstruct) {
442
- return
443
- }
444
-
445
- this.#headersList = new HeadersList()
446
-
447
- // The new Headers(init) constructor steps are:
448
-
449
- // 1. Set this’s guard to "none".
450
- this.#guard = 'none'
451
-
452
- // 2. If init is given, then fill this with init.
453
- if (init !== undefined) {
454
- init = webidl.converters.HeadersInit(init, 'Headers constructor', 'init')
455
- fill(this, init)
456
- }
457
- }
458
-
459
- // https://fetch.spec.whatwg.org/#dom-headers-append
460
- append (name, value) {
461
- webidl.brandCheck(this, Headers)
462
-
463
- webidl.argumentLengthCheck(arguments, 2, 'Headers.append')
464
-
465
- const prefix = 'Headers.append'
466
- name = webidl.converters.ByteString(name, prefix, 'name')
467
- value = webidl.converters.ByteString(value, prefix, 'value')
468
-
469
- return appendHeader(this, name, value)
470
- }
471
-
472
- // https://fetch.spec.whatwg.org/#dom-headers-delete
473
- delete (name) {
474
- webidl.brandCheck(this, Headers)
475
-
476
- webidl.argumentLengthCheck(arguments, 1, 'Headers.delete')
477
-
478
- const prefix = 'Headers.delete'
479
- name = webidl.converters.ByteString(name, prefix, 'name')
480
-
481
- // 1. If name is not a header name, then throw a TypeError.
482
- if (!isValidHeaderName(name)) {
483
- throw webidl.errors.invalidArgument({
484
- prefix: 'Headers.delete',
485
- value: name,
486
- type: 'header name'
487
- })
488
- }
489
-
490
- // 2. If this’s guard is "immutable", then throw a TypeError.
491
- // 3. Otherwise, if this’s guard is "request" and name is a
492
- // forbidden header name, return.
493
- // 4. Otherwise, if this’s guard is "request-no-cors", name
494
- // is not a no-CORS-safelisted request-header name, and
495
- // name is not a privileged no-CORS request-header name,
496
- // return.
497
- // 5. Otherwise, if this’s guard is "response" and name is
498
- // a forbidden response-header name, return.
499
- // Note: undici does not implement forbidden header names
500
- if (this.#guard === 'immutable') {
501
- throw new TypeError('immutable')
502
- }
503
-
504
- // 6. If this’s header list does not contain name, then
505
- // return.
506
- if (!this.#headersList.contains(name, false)) {
507
- return
508
- }
509
-
510
- // 7. Delete name from this’s header list.
511
- // 8. If this’s guard is "request-no-cors", then remove
512
- // privileged no-CORS request headers from this.
513
- this.#headersList.delete(name, false)
514
- }
515
-
516
- // https://fetch.spec.whatwg.org/#dom-headers-get
517
- get (name) {
518
- webidl.brandCheck(this, Headers)
519
-
520
- webidl.argumentLengthCheck(arguments, 1, 'Headers.get')
521
-
522
- const prefix = 'Headers.get'
523
- name = webidl.converters.ByteString(name, prefix, 'name')
524
-
525
- // 1. If name is not a header name, then throw a TypeError.
526
- if (!isValidHeaderName(name)) {
527
- throw webidl.errors.invalidArgument({
528
- prefix,
529
- value: name,
530
- type: 'header name'
531
- })
532
- }
533
-
534
- // 2. Return the result of getting name from this’s header
535
- // list.
536
- return this.#headersList.get(name, false)
537
- }
538
-
539
- // https://fetch.spec.whatwg.org/#dom-headers-has
540
- has (name) {
541
- webidl.brandCheck(this, Headers)
542
-
543
- webidl.argumentLengthCheck(arguments, 1, 'Headers.has')
544
-
545
- const prefix = 'Headers.has'
546
- name = webidl.converters.ByteString(name, prefix, 'name')
547
-
548
- // 1. If name is not a header name, then throw a TypeError.
549
- if (!isValidHeaderName(name)) {
550
- throw webidl.errors.invalidArgument({
551
- prefix,
552
- value: name,
553
- type: 'header name'
554
- })
555
- }
556
-
557
- // 2. Return true if this’s header list contains name;
558
- // otherwise false.
559
- return this.#headersList.contains(name, false)
560
- }
561
-
562
- // https://fetch.spec.whatwg.org/#dom-headers-set
563
- set (name, value) {
564
- webidl.brandCheck(this, Headers)
565
-
566
- webidl.argumentLengthCheck(arguments, 2, 'Headers.set')
567
-
568
- const prefix = 'Headers.set'
569
- name = webidl.converters.ByteString(name, prefix, 'name')
570
- value = webidl.converters.ByteString(value, prefix, 'value')
571
-
572
- // 1. Normalize value.
573
- value = headerValueNormalize(value)
574
-
575
- // 2. If name is not a header name or value is not a
576
- // header value, then throw a TypeError.
577
- if (!isValidHeaderName(name)) {
578
- throw webidl.errors.invalidArgument({
579
- prefix,
580
- value: name,
581
- type: 'header name'
582
- })
583
- } else if (!isValidHeaderValue(value)) {
584
- throw webidl.errors.invalidArgument({
585
- prefix,
586
- value,
587
- type: 'header value'
588
- })
589
- }
590
-
591
- // 3. If this’s guard is "immutable", then throw a TypeError.
592
- // 4. Otherwise, if this’s guard is "request" and name is a
593
- // forbidden header name, return.
594
- // 5. Otherwise, if this’s guard is "request-no-cors" and
595
- // name/value is not a no-CORS-safelisted request-header,
596
- // return.
597
- // 6. Otherwise, if this’s guard is "response" and name is a
598
- // forbidden response-header name, return.
599
- // Note: undici does not implement forbidden header names
600
- if (this.#guard === 'immutable') {
601
- throw new TypeError('immutable')
602
- }
603
-
604
- // 7. Set (name, value) in this’s header list.
605
- // 8. If this’s guard is "request-no-cors", then remove
606
- // privileged no-CORS request headers from this
607
- this.#headersList.set(name, value, false)
608
- }
609
-
610
- // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
611
- getSetCookie () {
612
- webidl.brandCheck(this, Headers)
613
-
614
- // 1. If this’s header list does not contain `Set-Cookie`, then return « ».
615
- // 2. Return the values of all headers in this’s header list whose name is
616
- // a byte-case-insensitive match for `Set-Cookie`, in order.
617
-
618
- const list = this.#headersList.cookies
619
-
620
- if (list) {
621
- return [...list]
622
- }
623
-
624
- return []
625
- }
626
-
627
- [util.inspect.custom] (depth, options) {
628
- options.depth ??= depth
629
-
630
- return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`
631
- }
632
-
633
- static getHeadersGuard (o) {
634
- return o.#guard
635
- }
636
-
637
- static setHeadersGuard (o, guard) {
638
- o.#guard = guard
639
- }
640
-
641
- /**
642
- * @param {Headers} o
643
- */
644
- static getHeadersList (o) {
645
- return o.#headersList
646
- }
647
-
648
- /**
649
- * @param {Headers} target
650
- * @param {HeadersList} list
651
- */
652
- static setHeadersList (target, list) {
653
- target.#headersList = list
654
- }
655
- }
656
-
657
- const { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers
658
- Reflect.deleteProperty(Headers, 'getHeadersGuard')
659
- Reflect.deleteProperty(Headers, 'setHeadersGuard')
660
- Reflect.deleteProperty(Headers, 'getHeadersList')
661
- Reflect.deleteProperty(Headers, 'setHeadersList')
662
-
663
- iteratorMixin('Headers', Headers, headersListSortAndCombine, 0, 1)
664
-
665
- Object.defineProperties(Headers.prototype, {
666
- append: kEnumerableProperty,
667
- delete: kEnumerableProperty,
668
- get: kEnumerableProperty,
669
- has: kEnumerableProperty,
670
- set: kEnumerableProperty,
671
- getSetCookie: kEnumerableProperty,
672
- [Symbol.toStringTag]: {
673
- value: 'Headers',
674
- configurable: true
675
- },
676
- [util.inspect.custom]: {
677
- enumerable: false
678
- }
679
- })
680
-
681
- webidl.converters.HeadersInit = function (V, prefix, argument) {
682
- if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {
683
- const iterator = Reflect.get(V, Symbol.iterator)
684
-
685
- // A work-around to ensure we send the properly-cased Headers when V is a Headers object.
686
- // Read https://github.com/nodejs/undici/pull/3159#issuecomment-2075537226 before touching, please.
687
- if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { // Headers object
688
- try {
689
- return getHeadersList(V).entriesList
690
- } catch {
691
- // fall-through
692
- }
693
- }
694
-
695
- if (typeof iterator === 'function') {
696
- return webidl.converters['sequence<sequence<ByteString>>'](V, prefix, argument, iterator.bind(V))
697
- }
698
-
699
- return webidl.converters['record<ByteString, ByteString>'](V, prefix, argument)
700
- }
701
-
702
- throw webidl.errors.conversionFailed({
703
- prefix: 'Headers constructor',
704
- argument: 'Argument 1',
705
- types: ['sequence<sequence<ByteString>>', 'record<ByteString, ByteString>']
706
- })
707
- }
708
-
709
- module.exports = {
710
- fill,
711
- // for test.
712
- compareHeaderName,
713
- Headers,
714
- HeadersList,
715
- getHeadersGuard,
716
- setHeadersGuard,
717
- setHeadersList,
718
- getHeadersList
719
- }