arc-1 1.1.2 → 1.3.0

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 (357) hide show
  1. package/README.md +16 -6
  2. package/bin/start-cf.sh +32 -0
  3. package/dist/adt/atc-batch.d.ts +71 -0
  4. package/dist/adt/atc-batch.d.ts.map +1 -0
  5. package/dist/adt/atc-batch.js +182 -0
  6. package/dist/adt/atc-batch.js.map +1 -0
  7. package/dist/adt/atc.d.ts +34 -0
  8. package/dist/adt/atc.d.ts.map +1 -1
  9. package/dist/adt/atc.js +58 -12
  10. package/dist/adt/atc.js.map +1 -1
  11. package/dist/adt/aunit.d.ts.map +1 -1
  12. package/dist/adt/aunit.js +50 -7
  13. package/dist/adt/aunit.js.map +1 -1
  14. package/dist/adt/bounded-response.d.ts +12 -0
  15. package/dist/adt/bounded-response.d.ts.map +1 -0
  16. package/dist/adt/bounded-response.js +242 -0
  17. package/dist/adt/bounded-response.js.map +1 -0
  18. package/dist/adt/ci-quality-xml.d.ts +44 -0
  19. package/dist/adt/ci-quality-xml.d.ts.map +1 -0
  20. package/dist/adt/ci-quality-xml.js +98 -0
  21. package/dist/adt/ci-quality-xml.js.map +1 -0
  22. package/dist/adt/ci-quality.d.ts +64 -0
  23. package/dist/adt/ci-quality.d.ts.map +1 -0
  24. package/dist/adt/ci-quality.js +132 -0
  25. package/dist/adt/ci-quality.js.map +1 -0
  26. package/dist/adt/client.d.ts +55 -34
  27. package/dist/adt/client.d.ts.map +1 -1
  28. package/dist/adt/client.js +130 -169
  29. package/dist/adt/client.js.map +1 -1
  30. package/dist/adt/config.d.ts +6 -0
  31. package/dist/adt/config.d.ts.map +1 -1
  32. package/dist/adt/config.js +3 -0
  33. package/dist/adt/config.js.map +1 -1
  34. package/dist/adt/data-result-context.d.ts +46 -0
  35. package/dist/adt/data-result-context.d.ts.map +1 -0
  36. package/dist/adt/data-result-context.js +118 -0
  37. package/dist/adt/data-result-context.js.map +1 -0
  38. package/dist/adt/data-source-name.d.ts +60 -0
  39. package/dist/adt/data-source-name.d.ts.map +1 -0
  40. package/dist/adt/data-source-name.js +156 -0
  41. package/dist/adt/data-source-name.js.map +1 -0
  42. package/dist/adt/data-source-policy.d.ts +139 -0
  43. package/dist/adt/data-source-policy.d.ts.map +1 -0
  44. package/dist/adt/data-source-policy.js +759 -0
  45. package/dist/adt/data-source-policy.js.map +1 -0
  46. package/dist/adt/ddic-xml.d.ts +78 -4
  47. package/dist/adt/ddic-xml.d.ts.map +1 -1
  48. package/dist/adt/ddic-xml.js +647 -54
  49. package/dist/adt/ddic-xml.js.map +1 -1
  50. package/dist/adt/devtools.d.ts +1 -0
  51. package/dist/adt/devtools.d.ts.map +1 -1
  52. package/dist/adt/devtools.js +24 -4
  53. package/dist/adt/devtools.js.map +1 -1
  54. package/dist/adt/errors.d.ts +10 -0
  55. package/dist/adt/errors.d.ts.map +1 -1
  56. package/dist/adt/errors.js +17 -0
  57. package/dist/adt/errors.js.map +1 -1
  58. package/dist/adt/http-deadline.d.ts +10 -0
  59. package/dist/adt/http-deadline.d.ts.map +1 -1
  60. package/dist/adt/http-deadline.js +7 -0
  61. package/dist/adt/http-deadline.js.map +1 -1
  62. package/dist/adt/http.d.ts +6 -3
  63. package/dist/adt/http.d.ts.map +1 -1
  64. package/dist/adt/http.js +94 -55
  65. package/dist/adt/http.js.map +1 -1
  66. package/dist/adt/internal-data-operations.d.ts +56 -0
  67. package/dist/adt/internal-data-operations.d.ts.map +1 -0
  68. package/dist/adt/internal-data-operations.js +99 -0
  69. package/dist/adt/internal-data-operations.js.map +1 -0
  70. package/dist/adt/package-contents.d.ts +12 -0
  71. package/dist/adt/package-contents.d.ts.map +1 -0
  72. package/dist/adt/package-contents.js +19 -0
  73. package/dist/adt/package-contents.js.map +1 -0
  74. package/dist/adt/relation-objects.d.ts +385 -0
  75. package/dist/adt/relation-objects.d.ts.map +1 -0
  76. package/dist/adt/relation-objects.js +262 -0
  77. package/dist/adt/relation-objects.js.map +1 -0
  78. package/dist/adt/repository-relations.d.ts +41 -0
  79. package/dist/adt/repository-relations.d.ts.map +1 -0
  80. package/dist/adt/repository-relations.js +246 -0
  81. package/dist/adt/repository-relations.js.map +1 -0
  82. package/dist/adt/request-attempt-budget.d.ts +26 -0
  83. package/dist/adt/request-attempt-budget.d.ts.map +1 -0
  84. package/dist/adt/request-attempt-budget.js +63 -0
  85. package/dist/adt/request-attempt-budget.js.map +1 -0
  86. package/dist/adt/result-limits.d.ts +3 -0
  87. package/dist/adt/result-limits.d.ts.map +1 -0
  88. package/dist/adt/result-limits.js +7 -0
  89. package/dist/adt/result-limits.js.map +1 -0
  90. package/dist/adt/safety.d.ts +2 -0
  91. package/dist/adt/safety.d.ts.map +1 -1
  92. package/dist/adt/safety.js +6 -0
  93. package/dist/adt/safety.js.map +1 -1
  94. package/dist/adt/server-driven.d.ts +6 -1
  95. package/dist/adt/server-driven.d.ts.map +1 -1
  96. package/dist/adt/server-driven.js +24 -20
  97. package/dist/adt/server-driven.js.map +1 -1
  98. package/dist/adt/sql-source-analyzer.d.ts +12 -0
  99. package/dist/adt/sql-source-analyzer.d.ts.map +1 -0
  100. package/dist/adt/sql-source-analyzer.js +158 -0
  101. package/dist/adt/sql-source-analyzer.js.map +1 -0
  102. package/dist/adt/table-query.d.ts +43 -0
  103. package/dist/adt/table-query.d.ts.map +1 -0
  104. package/dist/adt/table-query.js +160 -0
  105. package/dist/adt/table-query.js.map +1 -0
  106. package/dist/adt/text-elements.d.ts +48 -0
  107. package/dist/adt/text-elements.d.ts.map +1 -0
  108. package/dist/adt/text-elements.js +116 -0
  109. package/dist/adt/text-elements.js.map +1 -0
  110. package/dist/adt/types.d.ts +16 -0
  111. package/dist/adt/types.d.ts.map +1 -1
  112. package/dist/adt/uiad.d.ts +19 -0
  113. package/dist/adt/uiad.d.ts.map +1 -0
  114. package/dist/adt/uiad.js +173 -0
  115. package/dist/adt/uiad.js.map +1 -0
  116. package/dist/adt/xml-parser.d.ts +12 -15
  117. package/dist/adt/xml-parser.d.ts.map +1 -1
  118. package/dist/adt/xml-parser.js +44 -12
  119. package/dist/adt/xml-parser.js.map +1 -1
  120. package/dist/authz/policy.d.ts.map +1 -1
  121. package/dist/authz/policy.js +4 -1
  122. package/dist/authz/policy.js.map +1 -1
  123. package/dist/cache/cache.d.ts +3 -23
  124. package/dist/cache/cache.d.ts.map +1 -1
  125. package/dist/cache/cache.js +2 -3
  126. package/dist/cache/cache.js.map +1 -1
  127. package/dist/cache/caching-layer.d.ts +6 -25
  128. package/dist/cache/caching-layer.d.ts.map +1 -1
  129. package/dist/cache/caching-layer.js +3 -45
  130. package/dist/cache/caching-layer.js.map +1 -1
  131. package/dist/cache/memory.d.ts +1 -4
  132. package/dist/cache/memory.d.ts.map +1 -1
  133. package/dist/cache/memory.js +1 -10
  134. package/dist/cache/memory.js.map +1 -1
  135. package/dist/cache/sqlite.d.ts +1 -3
  136. package/dist/cache/sqlite.d.ts.map +1 -1
  137. package/dist/cache/sqlite.js +2 -17
  138. package/dist/cache/sqlite.js.map +1 -1
  139. package/dist/cli-checks.d.ts +3 -0
  140. package/dist/cli-checks.d.ts.map +1 -1
  141. package/dist/cli-checks.js +16 -0
  142. package/dist/cli-checks.js.map +1 -1
  143. package/dist/cli.d.ts.map +1 -1
  144. package/dist/cli.js +7 -2
  145. package/dist/cli.js.map +1 -1
  146. package/dist/context/compressor.d.ts +2 -3
  147. package/dist/context/compressor.d.ts.map +1 -1
  148. package/dist/context/compressor.js +30 -49
  149. package/dist/context/compressor.js.map +1 -1
  150. package/dist/context/contract.d.ts +5 -0
  151. package/dist/context/contract.d.ts.map +1 -1
  152. package/dist/context/contract.js +2 -2
  153. package/dist/context/contract.js.map +1 -1
  154. package/dist/context/deps.d.ts +11 -0
  155. package/dist/context/deps.d.ts.map +1 -1
  156. package/dist/context/deps.js +2 -2
  157. package/dist/context/deps.js.map +1 -1
  158. package/dist/context/parse-cache.d.ts +23 -0
  159. package/dist/context/parse-cache.d.ts.map +1 -0
  160. package/dist/context/parse-cache.js +71 -0
  161. package/dist/context/parse-cache.js.map +1 -0
  162. package/dist/context/relation-walk.d.ts +48 -0
  163. package/dist/context/relation-walk.d.ts.map +1 -0
  164. package/dist/context/relation-walk.js +137 -0
  165. package/dist/context/relation-walk.js.map +1 -0
  166. package/dist/context/types.d.ts +4 -4
  167. package/dist/context/types.d.ts.map +1 -1
  168. package/dist/handlers/activate.d.ts +1 -1
  169. package/dist/handlers/activate.d.ts.map +1 -1
  170. package/dist/handlers/activate.js +33 -56
  171. package/dist/handlers/activate.js.map +1 -1
  172. package/dist/handlers/activation-results.d.ts +3 -0
  173. package/dist/handlers/activation-results.d.ts.map +1 -0
  174. package/dist/handlers/activation-results.js +8 -0
  175. package/dist/handlers/activation-results.js.map +1 -0
  176. package/dist/handlers/context.d.ts.map +1 -1
  177. package/dist/handlers/context.js +8 -32
  178. package/dist/handlers/context.js.map +1 -1
  179. package/dist/handlers/data-element-fields.d.ts +26 -0
  180. package/dist/handlers/data-element-fields.d.ts.map +1 -0
  181. package/dist/handlers/data-element-fields.js +27 -0
  182. package/dist/handlers/data-element-fields.js.map +1 -0
  183. package/dist/handlers/diagnose-ci.d.ts +9 -0
  184. package/dist/handlers/diagnose-ci.d.ts.map +1 -0
  185. package/dist/handlers/diagnose-ci.js +120 -0
  186. package/dist/handlers/diagnose-ci.js.map +1 -0
  187. package/dist/handlers/diagnose-fields.d.ts +51 -0
  188. package/dist/handlers/diagnose-fields.d.ts.map +1 -0
  189. package/dist/handlers/diagnose-fields.js +48 -0
  190. package/dist/handlers/diagnose-fields.js.map +1 -0
  191. package/dist/handlers/diagnose.d.ts +4 -1
  192. package/dist/handlers/diagnose.d.ts.map +1 -1
  193. package/dist/handlers/diagnose.js +41 -6
  194. package/dist/handlers/diagnose.js.map +1 -1
  195. package/dist/handlers/dispatch.d.ts +3 -1
  196. package/dist/handlers/dispatch.d.ts.map +1 -1
  197. package/dist/handlers/dispatch.js +96 -11
  198. package/dist/handlers/dispatch.js.map +1 -1
  199. package/dist/handlers/feature-cache.d.ts +4 -3
  200. package/dist/handlers/feature-cache.d.ts.map +1 -1
  201. package/dist/handlers/feature-cache.js +4 -3
  202. package/dist/handlers/feature-cache.js.map +1 -1
  203. package/dist/handlers/hyperfocused.js +1 -1
  204. package/dist/handlers/live-relations.d.ts +5 -0
  205. package/dist/handlers/live-relations.d.ts.map +1 -0
  206. package/dist/handlers/live-relations.js +89 -0
  207. package/dist/handlers/live-relations.js.map +1 -0
  208. package/dist/handlers/manage.d.ts.map +1 -1
  209. package/dist/handlers/manage.js +7 -4
  210. package/dist/handlers/manage.js.map +1 -1
  211. package/dist/handlers/navigate.d.ts +1 -1
  212. package/dist/handlers/navigate.d.ts.map +1 -1
  213. package/dist/handlers/navigate.js +33 -7
  214. package/dist/handlers/navigate.js.map +1 -1
  215. package/dist/handlers/object-types.d.ts +6 -4
  216. package/dist/handlers/object-types.d.ts.map +1 -1
  217. package/dist/handlers/object-types.js +45 -10
  218. package/dist/handlers/object-types.js.map +1 -1
  219. package/dist/handlers/query-errors.d.ts +9 -1
  220. package/dist/handlers/query-errors.d.ts.map +1 -1
  221. package/dist/handlers/query-errors.js +40 -28
  222. package/dist/handlers/query-errors.js.map +1 -1
  223. package/dist/handlers/query.d.ts +2 -2
  224. package/dist/handlers/query.d.ts.map +1 -1
  225. package/dist/handlers/query.js +15 -22
  226. package/dist/handlers/query.js.map +1 -1
  227. package/dist/handlers/read.d.ts +1 -1
  228. package/dist/handlers/read.d.ts.map +1 -1
  229. package/dist/handlers/read.js +112 -23
  230. package/dist/handlers/read.js.map +1 -1
  231. package/dist/handlers/relation-input.d.ts +42 -0
  232. package/dist/handlers/relation-input.d.ts.map +1 -0
  233. package/dist/handlers/relation-input.js +22 -0
  234. package/dist/handlers/relation-input.js.map +1 -0
  235. package/dist/handlers/relation-tool.d.ts +5 -0
  236. package/dist/handlers/relation-tool.d.ts.map +1 -0
  237. package/dist/handlers/relation-tool.js +36 -0
  238. package/dist/handlers/relation-tool.js.map +1 -0
  239. package/dist/handlers/schemas.d.ts +119 -62
  240. package/dist/handlers/schemas.d.ts.map +1 -1
  241. package/dist/handlers/schemas.js +150 -13
  242. package/dist/handlers/schemas.js.map +1 -1
  243. package/dist/handlers/search.d.ts +1 -1
  244. package/dist/handlers/search.d.ts.map +1 -1
  245. package/dist/handlers/search.js +43 -8
  246. package/dist/handlers/search.js.map +1 -1
  247. package/dist/handlers/tool-descriptions.d.ts.map +1 -1
  248. package/dist/handlers/tool-descriptions.js +12 -13
  249. package/dist/handlers/tool-descriptions.js.map +1 -1
  250. package/dist/handlers/tool-registry.d.ts +1 -0
  251. package/dist/handlers/tool-registry.d.ts.map +1 -1
  252. package/dist/handlers/tool-registry.js +4 -0
  253. package/dist/handlers/tool-registry.js.map +1 -1
  254. package/dist/handlers/tools.d.ts +2 -3
  255. package/dist/handlers/tools.d.ts.map +1 -1
  256. package/dist/handlers/tools.js +139 -84
  257. package/dist/handlers/tools.js.map +1 -1
  258. package/dist/handlers/where-used.d.ts +2 -0
  259. package/dist/handlers/where-used.d.ts.map +1 -1
  260. package/dist/handlers/where-used.js +23 -5
  261. package/dist/handlers/where-used.js.map +1 -1
  262. package/dist/handlers/write/batch-results.d.ts +28 -0
  263. package/dist/handlers/write/batch-results.d.ts.map +1 -0
  264. package/dist/handlers/write/batch-results.js +106 -0
  265. package/dist/handlers/write/batch-results.js.map +1 -0
  266. package/dist/handlers/write/create-transport.d.ts +7 -0
  267. package/dist/handlers/write/create-transport.d.ts.map +1 -0
  268. package/dist/handlers/write/create-transport.js +38 -0
  269. package/dist/handlers/write/create-transport.js.map +1 -0
  270. package/dist/handlers/write/create.d.ts.map +1 -1
  271. package/dist/handlers/write/create.js +276 -413
  272. package/dist/handlers/write/create.js.map +1 -1
  273. package/dist/handlers/write/uiad.d.ts +8 -0
  274. package/dist/handlers/write/uiad.d.ts.map +1 -0
  275. package/dist/handlers/write/uiad.js +115 -0
  276. package/dist/handlers/write/uiad.js.map +1 -0
  277. package/dist/handlers/write/update-delete.d.ts +6 -6
  278. package/dist/handlers/write/update-delete.d.ts.map +1 -1
  279. package/dist/handlers/write/update-delete.js +46 -15
  280. package/dist/handlers/write/update-delete.js.map +1 -1
  281. package/dist/handlers/write-helpers.d.ts +0 -6
  282. package/dist/handlers/write-helpers.d.ts.map +1 -1
  283. package/dist/handlers/write-helpers.js +88 -80
  284. package/dist/handlers/write-helpers.js.map +1 -1
  285. package/dist/handlers/write.d.ts.map +1 -1
  286. package/dist/handlers/write.js +5 -1
  287. package/dist/handlers/write.js.map +1 -1
  288. package/dist/public/index.d.ts +1 -1
  289. package/dist/public/index.d.ts.map +1 -1
  290. package/dist/public/index.js +1 -1
  291. package/dist/public/index.js.map +1 -1
  292. package/dist/public/ui/app.js +0 -2
  293. package/dist/server/audit.d.ts +42 -1
  294. package/dist/server/audit.d.ts.map +1 -1
  295. package/dist/server/audit.js.map +1 -1
  296. package/dist/server/config.d.ts +4 -0
  297. package/dist/server/config.d.ts.map +1 -1
  298. package/dist/server/config.js +67 -0
  299. package/dist/server/config.js.map +1 -1
  300. package/dist/server/context.d.ts +5 -0
  301. package/dist/server/context.d.ts.map +1 -1
  302. package/dist/server/context.js.map +1 -1
  303. package/dist/server/destination-registry.d.ts +10 -2
  304. package/dist/server/destination-registry.d.ts.map +1 -1
  305. package/dist/server/destination-registry.js +12 -3
  306. package/dist/server/destination-registry.js.map +1 -1
  307. package/dist/server/effective-policy-log.d.ts +2 -1
  308. package/dist/server/effective-policy-log.d.ts.map +1 -1
  309. package/dist/server/effective-policy-log.js +18 -2
  310. package/dist/server/effective-policy-log.js.map +1 -1
  311. package/dist/server/http.d.ts +1 -1
  312. package/dist/server/http.d.ts.map +1 -1
  313. package/dist/server/http.js +1 -0
  314. package/dist/server/http.js.map +1 -1
  315. package/dist/server/logger.d.ts.map +1 -1
  316. package/dist/server/logger.js +4 -1
  317. package/dist/server/logger.js.map +1 -1
  318. package/dist/server/multi-target-runtime.d.ts.map +1 -1
  319. package/dist/server/multi-target-runtime.js +7 -2
  320. package/dist/server/multi-target-runtime.js.map +1 -1
  321. package/dist/server/multi-target-tools.d.ts.map +1 -1
  322. package/dist/server/multi-target-tools.js +3 -1
  323. package/dist/server/multi-target-tools.js.map +1 -1
  324. package/dist/server/runtime-memory.d.ts +13 -0
  325. package/dist/server/runtime-memory.d.ts.map +1 -0
  326. package/dist/server/runtime-memory.js +42 -0
  327. package/dist/server/runtime-memory.js.map +1 -0
  328. package/dist/server/server-instructions.d.ts +2 -0
  329. package/dist/server/server-instructions.d.ts.map +1 -0
  330. package/dist/server/server-instructions.js +33 -0
  331. package/dist/server/server-instructions.js.map +1 -0
  332. package/dist/server/server.d.ts +3 -2
  333. package/dist/server/server.d.ts.map +1 -1
  334. package/dist/server/server.js +42 -78
  335. package/dist/server/server.js.map +1 -1
  336. package/dist/server/shutdown.d.ts +6 -0
  337. package/dist/server/shutdown.d.ts.map +1 -0
  338. package/dist/server/shutdown.js +52 -0
  339. package/dist/server/shutdown.js.map +1 -0
  340. package/dist/server/sinks/btp-auditlog.d.ts +10 -8
  341. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -1
  342. package/dist/server/sinks/btp-auditlog.js +86 -68
  343. package/dist/server/sinks/btp-auditlog.js.map +1 -1
  344. package/dist/server/sinks/file.d.ts +1 -1
  345. package/dist/server/sinks/file.d.ts.map +1 -1
  346. package/dist/server/sinks/file.js +12 -21
  347. package/dist/server/sinks/file.js.map +1 -1
  348. package/dist/server/types.d.ts +8 -0
  349. package/dist/server/types.d.ts.map +1 -1
  350. package/dist/server/types.js +4 -0
  351. package/dist/server/types.js.map +1 -1
  352. package/dist/server/ui-state.d.ts.map +1 -1
  353. package/dist/server/ui-state.js +1 -0
  354. package/dist/server/ui-state.js.map +1 -1
  355. package/dist/server/ui.js +0 -2
  356. package/dist/server/ui.js.map +1 -1
  357. package/package.json +15 -13
@@ -0,0 +1,242 @@
1
+ import { getCurrentContext } from '../server/context.js';
2
+ import { AdtApiError } from './errors.js';
3
+ /** Optional scoped controls; existing unscoped reads retain their response behavior. */
4
+ export async function prepareBoundedResponse(response, url, options) {
5
+ if (options?.attemptBudget && !options.discardResponseBody && [401, 403].includes(response.status)) {
6
+ options.attemptBudget.authorizationFailureObserved = true;
7
+ }
8
+ if (options?.attemptBudget && response.status >= 300 && response.status < 400 && response.status !== 304) {
9
+ await response.body?.cancel();
10
+ throw new AdtApiError('Redirects are not allowed during bounded SAP analysis.', response.status, new URL(url).pathname);
11
+ }
12
+ if (options?.discardResponseBody) {
13
+ await response.body?.cancel();
14
+ return response;
15
+ }
16
+ return options?.responseBudget ? await capResponseBody(response, options.responseBudget) : response;
17
+ }
18
+ function cloneResponseHeaders(headers) {
19
+ const copy = new Headers();
20
+ let legacySetCookie;
21
+ for (const [key, value] of headers.entries()) {
22
+ if (key.toLowerCase() === 'set-cookie')
23
+ legacySetCookie = value;
24
+ else
25
+ copy.append(key, value);
26
+ }
27
+ const getSetCookie = headers.getSetCookie;
28
+ const setCookies = getSetCookie?.call(headers) ?? (legacySetCookie ? [legacySetCookie] : []);
29
+ for (const cookie of setCookies)
30
+ copy.append('set-cookie', cookie);
31
+ return copy;
32
+ }
33
+ /** Apply the cumulative post-content-decoding allowance before string conversion. */
34
+ export async function capResponseBody(response, budget) {
35
+ const responseBody = response.body;
36
+ if (responseBody === null)
37
+ return response;
38
+ const requestId = getCurrentContext()?.requestId;
39
+ const contentEncoding = response.headers.get('content-encoding')?.trim().toLowerCase();
40
+ const contentLength = response.headers.get('content-length')?.trim();
41
+ if ((!contentEncoding || contentEncoding === 'identity') && contentLength && /^\d+$/.test(contentLength)) {
42
+ const declaredBytes = Number(contentLength);
43
+ if (Number.isSafeInteger(declaredBytes)) {
44
+ try {
45
+ budget.assertSingleResponseBytes(declaredBytes, requestId);
46
+ }
47
+ catch (error) {
48
+ try {
49
+ await responseBody.cancel(error);
50
+ }
51
+ catch {
52
+ // Preserve the response-limit error.
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ }
58
+ const reader = responseBody.getReader();
59
+ const reservation = response.ok ? budget.createReservation() : undefined;
60
+ let seenBytes = 0;
61
+ let settled = false;
62
+ const release = () => {
63
+ if (settled)
64
+ return;
65
+ settled = true;
66
+ reservation?.release();
67
+ };
68
+ const cappedBody = new ReadableStream({
69
+ async pull(controller) {
70
+ try {
71
+ const chunk = await reader.read();
72
+ if (chunk.done) {
73
+ if (!settled) {
74
+ settled = true;
75
+ reservation?.commit();
76
+ }
77
+ controller.close();
78
+ return;
79
+ }
80
+ const nextSeenBytes = seenBytes + chunk.value.byteLength;
81
+ if (reservation)
82
+ reservation.add(chunk.value.byteLength, requestId);
83
+ else
84
+ budget.assertSingleResponseBytes(nextSeenBytes, requestId);
85
+ seenBytes = nextSeenBytes;
86
+ controller.enqueue(chunk.value);
87
+ }
88
+ catch (error) {
89
+ release();
90
+ try {
91
+ await reader.cancel(error);
92
+ }
93
+ catch {
94
+ // Preserve the original stream/budget error.
95
+ }
96
+ controller.error(error);
97
+ }
98
+ },
99
+ async cancel(reason) {
100
+ release();
101
+ await reader.cancel(reason);
102
+ },
103
+ });
104
+ return new Response(cappedBody, {
105
+ status: response.status,
106
+ statusText: response.statusText,
107
+ headers: cloneResponseHeaders(response.headers),
108
+ });
109
+ }
110
+ function destroyProxyBody(body) {
111
+ // Observe disposal errors even before the first read; otherwise UND_ERR_ABORTED can escape (#805).
112
+ body.on('error', () => { }).destroy();
113
+ }
114
+ function proxyResponseBody(body, client, signal) {
115
+ // Do not bridge Undici's BodyReadable through Readable.toWeb(). Cancelling that
116
+ // adapter closes its web-stream controller before Client.destroy() has drained
117
+ // already-queued BodyReadable data, so a late data event can enqueue into the
118
+ // closed controller and terminate the process with ERR_INVALID_STATE (#737).
119
+ // Reading the Node stream directly keeps cancellation and client ownership in
120
+ // this one adapter and gives late source events no web controller to reach.
121
+ const iterator = body[Symbol.asyncIterator]();
122
+ let streamController;
123
+ let settled = false;
124
+ let ended = false;
125
+ const asError = (reason, fallback) => reason instanceof Error ? reason : new Error(reason === undefined ? fallback : String(reason));
126
+ const onAbort = () => {
127
+ if (ended)
128
+ return;
129
+ ended = true;
130
+ const cause = asError(signal.reason, 'The proxy response stream was aborted.');
131
+ try {
132
+ streamController?.error(cause);
133
+ }
134
+ catch {
135
+ // A simultaneous consumer cancellation may already have closed the stream.
136
+ }
137
+ void settle(cause).catch(() => {
138
+ // The abort reason is already visible to the consumer.
139
+ });
140
+ };
141
+ const settle = async (error) => {
142
+ if (settled)
143
+ return;
144
+ settled = true;
145
+ signal.removeEventListener('abort', onAbort);
146
+ if (error) {
147
+ // Stop the body, handling disposal errors even before the first read, then
148
+ // destroy its dedicated client with the original cause.
149
+ if (!body.destroyed)
150
+ destroyProxyBody(body);
151
+ await client.destroy(error);
152
+ }
153
+ else {
154
+ await client.close();
155
+ }
156
+ };
157
+ return new ReadableStream({
158
+ start(controller) {
159
+ streamController = controller;
160
+ if (signal.aborted)
161
+ onAbort();
162
+ else
163
+ signal.addEventListener('abort', onAbort, { once: true });
164
+ },
165
+ async pull(controller) {
166
+ try {
167
+ const chunk = await iterator.next();
168
+ if (ended)
169
+ return;
170
+ if (chunk.done) {
171
+ ended = true;
172
+ try {
173
+ await settle();
174
+ controller.close();
175
+ }
176
+ catch (error) {
177
+ controller.error(error);
178
+ }
179
+ return;
180
+ }
181
+ if (!(chunk.value instanceof Uint8Array)) {
182
+ throw new TypeError('The proxy response body emitted a non-byte chunk.');
183
+ }
184
+ controller.enqueue(chunk.value);
185
+ }
186
+ catch (error) {
187
+ if (ended)
188
+ return;
189
+ ended = true;
190
+ const cause = asError(error, 'The proxy response stream failed.');
191
+ try {
192
+ await settle(cause);
193
+ }
194
+ finally {
195
+ controller.error(cause);
196
+ }
197
+ }
198
+ },
199
+ async cancel(reason) {
200
+ if (ended)
201
+ return;
202
+ ended = true;
203
+ await settle(asError(reason, 'The proxy response stream was cancelled.'));
204
+ },
205
+ });
206
+ }
207
+ /** Convert one Connectivity response while preserving ownership of its short-lived client. */
208
+ export async function connectivityProxyResponse(response, client, signal, bounded, headersOnly = false) {
209
+ const headers = new Headers();
210
+ for (const [key, value] of Object.entries(response.headers)) {
211
+ if (value === undefined)
212
+ continue;
213
+ for (const item of Array.isArray(value) ? value : [String(value)])
214
+ headers.append(key, item);
215
+ }
216
+ if (headersOnly) {
217
+ // CSRF GET fallback can return a large discovery document. It is not result data;
218
+ // destroy its dedicated transport without ever buffering or decoding that body.
219
+ destroyProxyBody(response.body);
220
+ await client.destroy();
221
+ return new Response(null, { status: response.statusCode, headers });
222
+ }
223
+ if (response.statusCode === 204 || response.statusCode === 205 || response.statusCode === 304) {
224
+ destroyProxyBody(response.body);
225
+ return new Response(null, { status: response.statusCode, headers });
226
+ }
227
+ if (!bounded) {
228
+ return new Response(await response.body.text(), { status: response.statusCode, headers });
229
+ }
230
+ const contentEncoding = headers.get('content-encoding')?.trim().toLowerCase();
231
+ if (contentEncoding && contentEncoding !== 'identity') {
232
+ const error = new Error(`Unexpected Content-Encoding '${contentEncoding}' on bounded proxy response.`);
233
+ destroyProxyBody(response.body);
234
+ await client.destroy(error);
235
+ throw error;
236
+ }
237
+ return new Response(proxyResponseBody(response.body, client, signal), {
238
+ status: response.statusCode,
239
+ headers,
240
+ });
241
+ }
242
+ //# sourceMappingURL=bounded-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-response.js","sourceRoot":"","sources":["../../src/adt/bounded-response.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAkB,EAClB,GAAW,EACX,OAA2B;IAE3B,IAAI,OAAO,EAAE,aAAa,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnG,OAAO,CAAC,aAAa,CAAC,4BAA4B,GAAG,IAAI,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,EAAE,aAAa,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,WAAW,CACnB,wDAAwD,EACxD,QAAQ,CAAC,MAAM,EACf,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;QACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtG,CAAC;AAID,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;IAC3B,IAAI,eAAmC,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY;YAAE,eAAe,GAAG,KAAK,CAAC;;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,YAAY,GAAI,OAAuD,CAAC,YAAY,CAAC;IAC3F,MAAM,UAAU,GAAG,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,KAAK,MAAM,MAAM,IAAI,UAAU;QAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,MAA0B;IAClF,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;IACnC,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,iBAAiB,EAAE,EAAE,SAAS,CAAC;IACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvF,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,CAAC,eAAe,IAAI,eAAe,KAAK,UAAU,CAAC,IAAI,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACzG,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,qCAAqC;gBACvC,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,WAAW,EAAE,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,cAAc,CAAa;QAChD,KAAK,CAAC,IAAI,CAAC,UAAU;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,GAAG,IAAI,CAAC;wBACf,WAAW,EAAE,MAAM,EAAE,CAAC;oBACxB,CAAC;oBACD,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzD,IAAI,WAAW;oBAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;;oBAC/D,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAChE,SAAS,GAAG,aAAa,CAAC;gBAC1B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,6CAA6C;gBAC/C,CAAC;gBACD,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,OAAO,EAAE,CAAC;YACV,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE;QAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;KAChD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,mGAAmG;IACnG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc,EAAE,MAAc,EAAE,MAAmB;IAC5E,gFAAgF;IAChF,+EAA+E;IAC/E,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAC9C,IAAI,gBAAyE,CAAC;IAC9E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,QAAgB,EAAS,EAAE,CAC3D,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjG,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,KAAK;YAAE,OAAO;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,wCAAwC,CAAC,CAAC;QAC/E,IAAI,CAAC;YACH,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,2EAA2E;QAC7E,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC5B,uDAAuD;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACrC,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,2EAA2E;YAC3E,wDAAwD;YACxD,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,IAAI,cAAc,CAAa;QACpC,KAAK,CAAC,UAAU;YACd,gBAAgB,GAAG,UAAU,CAAC;YAC9B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,UAAU;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,KAAK;oBAAE,OAAO;gBAClB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,KAAK,GAAG,IAAI,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,MAAM,EAAE,CAAC;wBACf,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;gBAC3E,CAAC;gBACD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK;oBAAE,OAAO;gBAClB,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,mCAAmC,CAAC,CAAC;gBAClE,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;wBAAS,CAAC;oBACT,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,QAAmC,EACnC,MAAc,EACd,MAAmB,EACnB,OAAgB,EAChB,WAAW,GAAG,KAAK;IAEnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,kFAAkF;QAClF,gFAAgF;QAChF,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC9F,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9E,IAAI,eAAe,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gCAAgC,eAAe,8BAA8B,CAAC,CAAC;QACvG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QACpE,MAAM,EAAE,QAAQ,CAAC,UAAU;QAC3B,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,44 @@
1
+ export declare const CI_REPORT_PARSE_LIMIT: number;
2
+ export declare const DEFAULT_ATC_CI_VARIANT = "ABAP_CLOUD_DEVELOPMENT_DEFAULT";
3
+ export type AtcCiSeverity = 'error' | 'warning' | 'info';
4
+ export interface CiObjectSet {
5
+ packages?: string[];
6
+ packageTrees?: string[];
7
+ }
8
+ export interface NormalizedCiObjectSet {
9
+ packages: string[];
10
+ packageTrees: string[];
11
+ }
12
+ export interface AtcCiFinding {
13
+ file: string;
14
+ message: string;
15
+ source: string;
16
+ line?: number;
17
+ severity: AtcCiSeverity;
18
+ }
19
+ export interface AtcCiSummary {
20
+ findingCount: number;
21
+ errorCount: number;
22
+ warningCount: number;
23
+ infoCount: number;
24
+ }
25
+ export interface CiRunStatusDocument {
26
+ status: string;
27
+ progress?: string;
28
+ resultHref?: string;
29
+ }
30
+ /** Input bounds are enforced by SAPDiagnose's strict schema before package verification. */
31
+ export declare function buildOslObjectSetXml(objectSet: NormalizedCiObjectSet): string;
32
+ export declare function buildAtcCiRunParametersXml(objectSet: NormalizedCiObjectSet, options?: {
33
+ variant?: string;
34
+ configuration?: string;
35
+ }): string;
36
+ export declare function reportRoot(xml: string, name: string, label?: string): Record<string, unknown>;
37
+ export declare function parseAtcCiRunStatus(xml: string): CiRunStatusDocument;
38
+ export declare function parseAtcCheckstyle(xml: string): {
39
+ findings: AtcCiFinding[];
40
+ summary: AtcCiSummary;
41
+ };
42
+ export declare function summarizeAtcFindings(findings: AtcCiFinding[]): AtcCiSummary;
43
+ export declare function atcFindingsFail(findings: AtcCiFinding[], threshold: AtcCiSeverity): boolean;
44
+ //# sourceMappingURL=ci-quality-xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-quality-xml.d.ts","sourceRoot":"","sources":["../../src/adt/ci-quality-xml.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,QAAkB,CAAC;AACrD,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;CACzB;AACD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,qBAAqB,GAAG,MAAM,CAW7E;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,qBAAqB,EAChC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,CAGR;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa3F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAYpE;AAUD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CA2BnG;AACD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,CAO3E;AACD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAG3F"}
@@ -0,0 +1,98 @@
1
+ /** Bounded package selection and strict Checkstyle parsing for the ATC CI API. */
2
+ import { XMLValidator } from 'fast-xml-parser';
3
+ import { escapeXmlAttr, findDeepNodes, parseXml } from './xml-parser.js';
4
+ export const CI_REPORT_PARSE_LIMIT = 2 * 1024 * 1024;
5
+ export const DEFAULT_ATC_CI_VARIANT = 'ABAP_CLOUD_DEVELOPMENT_DEFAULT';
6
+ /** Input bounds are enforced by SAPDiagnose's strict schema before package verification. */
7
+ export function buildOslObjectSetXml(objectSet) {
8
+ return ('<osl:objectSet xsi:type="osl:packageSet" xmlns:osl="http://www.sap.com/api/osl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
9
+ objectSet.packages
10
+ .map((name) => `<osl:package name="${escapeXmlAttr(name)}" includeSubpackages="false"/>`)
11
+ .join('') +
12
+ objectSet.packageTrees
13
+ .map((name) => `<osl:package name="${escapeXmlAttr(name)}" includeSubpackages="true"/>`)
14
+ .join('') +
15
+ '</osl:objectSet>');
16
+ }
17
+ export function buildAtcCiRunParametersXml(objectSet, options = {}) {
18
+ const variant = options.variant?.trim() || DEFAULT_ATC_CI_VARIANT;
19
+ return `<?xml version="1.0" encoding="UTF-8"?><atc:runparameters xmlns:atc="http://www.sap.com/adt/atc" checkVariant="${escapeXmlAttr(variant)}"${options.configuration ? ` configuration="${escapeXmlAttr(options.configuration)}"` : ''}>${buildOslObjectSetXml(objectSet)}</atc:runparameters>`;
20
+ }
21
+ export function reportRoot(xml, name, label = name) {
22
+ if (Buffer.byteLength(xml) > CI_REPORT_PARSE_LIMIT)
23
+ throw new Error(`${label} report exceeded the 2 MiB parsing limit.`);
24
+ if (XMLValidator.validate(xml) !== true || /<!DOCTYPE/i.test(xml))
25
+ throw new Error(`CI API returned invalid ${label} XML.`);
26
+ const parsed = parseXml(xml);
27
+ const keys = Object.keys(parsed).filter((key) => !key.startsWith('?') && !key.startsWith('@_'));
28
+ if (keys.length !== 1 || keys[0] !== name)
29
+ throw new Error(`CI API returned a non-${label} report.`);
30
+ const root = parsed[name];
31
+ if (root === '')
32
+ return {};
33
+ if (!root || typeof root !== 'object' || Array.isArray(root))
34
+ throw new Error(`CI API returned an invalid ${label} root.`);
35
+ return root;
36
+ }
37
+ export function parseAtcCiRunStatus(xml) {
38
+ const run = reportRoot(xml, 'run');
39
+ const links = findDeepNodes(run, 'link').filter((link) => String(link['@_type'] ?? '').includes('atc.checkstyle') || String(link['@_rel'] ?? '').endsWith('/atc/result'));
40
+ const progress = findDeepNodes(run, 'progress')[0];
41
+ return {
42
+ status: String(run['@_status'] ?? '').trim(),
43
+ ...(progress?.['@_description'] ? { progress: String(progress['@_description']) } : {}),
44
+ ...(links.length === 1 && links[0]?.['@_href'] ? { resultHref: String(links[0]['@_href']) } : {}),
45
+ };
46
+ }
47
+ function nodes(value) {
48
+ if (value === undefined)
49
+ return [];
50
+ return (Array.isArray(value) ? value : [value]).map((node) => {
51
+ if (!node || typeof node !== 'object' || Array.isArray(node))
52
+ throw new Error('Malformed Checkstyle entry.');
53
+ return node;
54
+ });
55
+ }
56
+ export function parseAtcCheckstyle(xml) {
57
+ const root = reportRoot(xml, 'checkstyle');
58
+ if (Object.keys(root).some((key) => !key.startsWith('@_') && key !== 'file'))
59
+ throw new Error('Unexpected Checkstyle report content.');
60
+ const findings = [];
61
+ for (const file of nodes(root.file)) {
62
+ if (typeof file['@_name'] !== 'string' || !file['@_name'])
63
+ throw new Error('Checkstyle file lacks a name.');
64
+ if (Object.keys(file).some((key) => !key.startsWith('@_') && key !== 'error'))
65
+ throw new Error('Unexpected Checkstyle file content.');
66
+ for (const error of nodes(file.error)) {
67
+ const severity = error['@_severity'];
68
+ if (severity !== 'error' && severity !== 'warning' && severity !== 'info')
69
+ throw new Error('Invalid Checkstyle severity.');
70
+ if (typeof error['@_message'] !== 'string' || !error['@_message'])
71
+ throw new Error('Checkstyle finding lacks a message.');
72
+ const line = error['@_line'] === undefined ? undefined : Number(error['@_line']);
73
+ if (line !== undefined && (!Number.isSafeInteger(line) || line < 0))
74
+ throw new Error('Invalid Checkstyle line.');
75
+ findings.push({
76
+ file: file['@_name'],
77
+ message: error['@_message'],
78
+ source: String(error['@_source'] ?? ''),
79
+ severity,
80
+ ...(line === undefined ? {} : { line }),
81
+ });
82
+ }
83
+ }
84
+ return { findings, summary: summarizeAtcFindings(findings) };
85
+ }
86
+ export function summarizeAtcFindings(findings) {
87
+ return {
88
+ findingCount: findings.length,
89
+ errorCount: findings.filter((x) => x.severity === 'error').length,
90
+ warningCount: findings.filter((x) => x.severity === 'warning').length,
91
+ infoCount: findings.filter((x) => x.severity === 'info').length,
92
+ };
93
+ }
94
+ export function atcFindingsFail(findings, threshold) {
95
+ const ranks = { error: 3, warning: 2, info: 1 };
96
+ return findings.some((finding) => ranks[finding.severity] >= ranks[threshold]);
97
+ }
98
+ //# sourceMappingURL=ci-quality-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-quality-xml.js","sourceRoot":"","sources":["../../src/adt/ci-quality-xml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type AtcCiSeverity, type CiObjectSet, type NormalizedCiObjectSet } from './ci-quality-xml.js';
2
+ import type { AdtHttpClient, AdtRequestOptions } from './http.js';
3
+ import { type SafetyConfig } from './safety.js';
4
+ export declare const ATC_CI_RUNS_PATH = "/sap/bc/adt/api/atc/runs";
5
+ export declare const ATC_CI_CONTENT_TYPE_RUN = "application/vnd.sap.atc.run.parameters.v1+xml; charset=utf-8";
6
+ export declare const ATC_CI_ACCEPT_CHECKSTYLE = "application/vnd.sap.atc.checkstyle.v1+xml";
7
+ export declare const CI_REPORT_XML_LIMIT: number;
8
+ export declare const CI_FINDINGS_LIMIT = 200;
9
+ export interface CiQualityClock {
10
+ now(): number;
11
+ sleep(ms: number, signal?: AbortSignal): Promise<void>;
12
+ }
13
+ export interface RunAtcCiOptions {
14
+ objectSet: CiObjectSet;
15
+ variant?: string;
16
+ configuration?: string;
17
+ failOnSeverity?: AtcCiSeverity;
18
+ timeoutSeconds: number;
19
+ signal?: AbortSignal;
20
+ clock?: CiQualityClock;
21
+ includeReportXml?: boolean;
22
+ }
23
+ /** Verify all named packages before starting any run; ATC additionally needs a nonempty selection. */
24
+ export declare function verifyCiPackages(http: AdtHttpClient, safety: SafetyConfig, input: CiObjectSet, requestOptions: AdtRequestOptions, requireObjects?: boolean): Promise<NormalizedCiObjectSet>;
25
+ export declare function probeAtcCi(http: AdtHttpClient, safety: SafetyConfig, requestOptions: AdtRequestOptions): Promise<boolean>;
26
+ export declare function runAtcCiCheck(http: AdtHttpClient, safety: SafetyConfig, options: RunAtcCiOptions): Promise<{
27
+ status: 'incomplete';
28
+ fail: boolean;
29
+ durationMs: number;
30
+ incompleteReason: string;
31
+ runPath: string | undefined;
32
+ lastStatus: string;
33
+ progress: string | undefined;
34
+ } | {
35
+ status: 'completed';
36
+ fail: boolean;
37
+ durationMs: number;
38
+ runPath: string;
39
+ resultPath: string;
40
+ summary: import("./ci-quality-xml.js").AtcCiSummary;
41
+ findings: import("./ci-quality-xml.js").AtcCiFinding[];
42
+ truncated: boolean;
43
+ reportXmlOmitted: string;
44
+ } | {
45
+ status: 'completed';
46
+ fail: boolean;
47
+ durationMs: number;
48
+ runPath: string;
49
+ resultPath: string;
50
+ summary: import("./ci-quality-xml.js").AtcCiSummary;
51
+ findings: import("./ci-quality-xml.js").AtcCiFinding[];
52
+ truncated: boolean;
53
+ reportXml: string;
54
+ } | {
55
+ status: 'completed';
56
+ fail: boolean;
57
+ durationMs: number;
58
+ runPath: string;
59
+ resultPath: string;
60
+ summary: import("./ci-quality-xml.js").AtcCiSummary;
61
+ findings: import("./ci-quality-xml.js").AtcCiFinding[];
62
+ truncated: boolean;
63
+ }>;
64
+ //# sourceMappingURL=ci-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-quality.d.ts","sourceRoot":"","sources":["../../src/adt/ci-quality.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAIlB,KAAK,WAAW,EAEhB,KAAK,qBAAqB,EAG3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAe,MAAM,WAAW,CAAC;AAE/E,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/E,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,uBAAuB,iEAAiE,CAAC;AACtG,eAAO,MAAM,wBAAwB,8CAA8C,CAAC;AACpF,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAC9C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,MAAM,WAAW,cAAc;IAC7B,GAAG,IAAI,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AACD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,sGAAsG;AACtG,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,iBAAiB,EACjC,cAAc,UAAQ,GACrB,OAAO,CAAC,qBAAqB,CAAC,CAoChC;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,iBAAiB,GAChC,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;YAY3F,YAAY;;;;;;;;YAqCN,WAAW;;;;;;;;;;YAAX,WAAW;;;;;;;;;;YAAX,WAAW;;;;;;;;GA4B5B"}
@@ -0,0 +1,132 @@
1
+ /** Package-based ATC CI client. AUnit CI reuses the existing reconciled handler. */
2
+ import { setTimeout as sleep } from 'node:timers/promises';
3
+ import { ATC_RUN_STATUS_MEDIA_TYPE, isAtcRunFailure } from './atc.js';
4
+ import { atcFindingsFail, buildAtcCiRunParametersXml, CI_REPORT_PARSE_LIMIT, parseAtcCheckstyle, parseAtcCiRunStatus, } from './ci-quality-xml.js';
5
+ import { AdtApiError, AdtNetworkError } from './errors.js';
6
+ import { assertCanonicalHostRelativeAdtPath } from './path-safety.js';
7
+ import { checkOperation, OperationType } from './safety.js';
8
+ import { findDeepNodes, parseSearchResults, parseXml } from './xml-parser.js';
9
+ export const ATC_CI_RUNS_PATH = '/sap/bc/adt/api/atc/runs';
10
+ export const ATC_CI_CONTENT_TYPE_RUN = 'application/vnd.sap.atc.run.parameters.v1+xml; charset=utf-8';
11
+ export const ATC_CI_ACCEPT_CHECKSTYLE = 'application/vnd.sap.atc.checkstyle.v1+xml';
12
+ export const CI_REPORT_XML_LIMIT = 256 * 1024;
13
+ export const CI_FINDINGS_LIMIT = 200;
14
+ /** Verify all named packages before starting any run; ATC additionally needs a nonempty selection. */
15
+ export async function verifyCiPackages(http, safety, input, requestOptions, requireObjects = false) {
16
+ checkOperation(safety, OperationType.Read, 'VerifyCiPackages');
17
+ const normalize = (names = []) => [...new Set(names.map((name) => name.toUpperCase()))];
18
+ const packageTrees = normalize(input.packageTrees);
19
+ const objectSet = {
20
+ packages: normalize(input.packages).filter((name) => !packageTrees.includes(name)),
21
+ packageTrees,
22
+ };
23
+ for (const name of [...objectSet.packages, ...objectSet.packageTrees]) {
24
+ let response;
25
+ try {
26
+ response = await http.get(`/sap/bc/adt/packages/${encodeURIComponent(name)}`, undefined, requestOptions);
27
+ }
28
+ catch (error) {
29
+ if (error instanceof AdtApiError && error.statusCode === 404)
30
+ throw new Error(`CI package ${name} does not exist or is not accessible. No run was started.`);
31
+ throw error;
32
+ }
33
+ const packages = findDeepNodes(parseXml(response.body), 'package');
34
+ if (!packages.some((pkg) => String(pkg['@_name'] ?? '').toUpperCase() === name))
35
+ throw new Error(`CI package ${name} could not be verified. No run was started.`);
36
+ if (requireObjects) {
37
+ const result = await http.get(`/sap/bc/adt/repository/informationsystem/search?operation=quickSearch&query=*&packageName=${encodeURIComponent(name)}&maxResults=1000`, undefined, requestOptions);
38
+ const objects = parseSearchResults(result.body).filter((object) => !/^DEVC(?:\/|$)/i.test(object.objectType) &&
39
+ (objectSet.packageTrees.includes(name) || object.packageName.toUpperCase() === name));
40
+ if (!objects.length)
41
+ throw new Error(`CI package selection ${name} is empty or could not be verified. No run was started.`);
42
+ }
43
+ }
44
+ return objectSet;
45
+ }
46
+ export async function probeAtcCi(http, safety, requestOptions) {
47
+ checkOperation(safety, OperationType.Read, 'ProbeAtcCi');
48
+ try {
49
+ await http.get(`${ATC_CI_RUNS_PATH}/00000000000000000000000000000000`, { Accept: ATC_RUN_STATUS_MEDIA_TYPE }, { ...requestOptions, probe: true });
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ if (error instanceof AdtApiError && [404, 405, 406, 415].includes(error.statusCode))
54
+ return false;
55
+ throw error;
56
+ }
57
+ }
58
+ export async function runAtcCiCheck(http, safety, options) {
59
+ checkOperation(safety, OperationType.Read, 'RunAtcCiCheck');
60
+ const clock = options.clock ?? {
61
+ now: Date.now,
62
+ sleep: (ms, signal) => sleep(ms, undefined, { signal }),
63
+ };
64
+ const started = clock.now();
65
+ const deadline = started + options.timeoutSeconds * 1000;
66
+ const requestOptions = { deadline, signal: options.signal };
67
+ let runPath;
68
+ let state = { status: 'not started' };
69
+ const incomplete = (reason) => ({
70
+ status: 'incomplete',
71
+ fail: true,
72
+ durationMs: clock.now() - started,
73
+ incompleteReason: reason,
74
+ runPath,
75
+ lastStatus: state.status,
76
+ progress: state.progress,
77
+ });
78
+ try {
79
+ options.signal?.throwIfAborted();
80
+ if (!(await probeAtcCi(http, safety, requestOptions)))
81
+ throw new Error('ATC CI API is not available on this system. Use SAPDiagnose action="atc" if supported.');
82
+ const objectSet = await verifyCiPackages(http, safety, options.objectSet, requestOptions, true);
83
+ const created = await http.post(`${ATC_CI_RUNS_PATH}?clientWait=false`, buildAtcCiRunParametersXml(objectSet, options), ATC_CI_CONTENT_TYPE_RUN, { Accept: ATC_RUN_STATUS_MEDIA_TYPE }, requestOptions);
84
+ runPath = assertCanonicalHostRelativeAdtPath(created.headers.location ?? created.headers.Location ?? '', `${ATC_CI_RUNS_PATH}/`);
85
+ while (clock.now() < deadline) {
86
+ options.signal?.throwIfAborted();
87
+ const response = await http.get(runPath, { Accept: ATC_RUN_STATUS_MEDIA_TYPE }, requestOptions);
88
+ state = parseAtcCiRunStatus(response.body);
89
+ if (/^completed$/i.test(state.status)) {
90
+ if (!state.resultHref)
91
+ return incomplete('Completed run has no unambiguous Checkstyle result link.');
92
+ const resultPath = assertCanonicalHostRelativeAdtPath(state.resultHref, '/sap/bc/adt/api/atc/results/');
93
+ const result = await http.get(resultPath, { Accept: ATC_CI_ACCEPT_CHECKSTYLE }, requestOptions);
94
+ if (Buffer.byteLength(result.body) > CI_REPORT_PARSE_LIMIT)
95
+ return incomplete('Checkstyle report exceeded the 2 MiB parsing limit.');
96
+ const parsed = parseAtcCheckstyle(result.body);
97
+ const reportTooLarge = Buffer.byteLength(result.body) > CI_REPORT_XML_LIMIT;
98
+ return {
99
+ status: 'completed',
100
+ fail: atcFindingsFail(parsed.findings, options.failOnSeverity ?? 'error'),
101
+ durationMs: clock.now() - started,
102
+ runPath,
103
+ resultPath,
104
+ summary: parsed.summary,
105
+ findings: parsed.findings.slice(0, CI_FINDINGS_LIMIT),
106
+ truncated: parsed.findings.length > CI_FINDINGS_LIMIT,
107
+ ...(options.includeReportXml
108
+ ? reportTooLarge
109
+ ? { reportXmlOmitted: 'Report exceeds 256 KiB.' }
110
+ : { reportXml: result.body }
111
+ : {}),
112
+ };
113
+ }
114
+ if (!state.status || isAtcRunFailure(state.status))
115
+ return incomplete('SAP did not complete the ATC CI run.');
116
+ const remaining = deadline - clock.now();
117
+ if (remaining <= 0)
118
+ break;
119
+ await clock.sleep(Math.min(5000, remaining), options.signal);
120
+ }
121
+ return incomplete('ATC CI deadline expired. Inspect the existing SAP run before starting another.');
122
+ }
123
+ catch (error) {
124
+ if (options.signal?.aborted)
125
+ return incomplete('ATC CI call cancelled; the SAP run may still exist.');
126
+ const cause = error instanceof AdtNetworkError ? error.cause : error;
127
+ if (cause instanceof Error && cause.name === 'TimeoutError')
128
+ return incomplete('ATC CI deadline expired. Inspect the existing SAP run before starting another.');
129
+ throw error;
130
+ }
131
+ }
132
+ //# sourceMappingURL=ci-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-quality.js","sourceRoot":"","sources":["../../src/adt/ci-quality.ts"],"names":[],"mappings":"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"}