@wirebench/engine 2.2.0 → 3.1.0-rc.1

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 (566) hide show
  1. package/README.md +134 -1
  2. package/dist/account/schema.d.ts +34 -0
  3. package/dist/account/schema.js +29 -0
  4. package/dist/assert/callback.d.ts +76 -0
  5. package/dist/assert/callback.js +320 -0
  6. package/dist/assert/capture-source.d.ts +50 -0
  7. package/dist/assert/capture-source.js +89 -0
  8. package/dist/assert/check.d.ts +8 -0
  9. package/dist/assert/check.js +18 -0
  10. package/dist/assert/header.d.ts +5 -0
  11. package/dist/assert/header.js +48 -0
  12. package/dist/assert/index.d.ts +2 -2
  13. package/dist/assert/index.js +12 -0
  14. package/dist/assert/match.d.ts +6 -0
  15. package/dist/assert/match.js +13 -4
  16. package/dist/assert/model.d.ts +110 -3
  17. package/dist/assert/model.js +16 -1
  18. package/dist/assert/schema.d.ts +194 -1
  19. package/dist/assert/schema.js +154 -12
  20. package/dist/assert/status-names.d.ts +9 -0
  21. package/dist/assert/status-names.js +27 -0
  22. package/dist/assert/status.d.ts +4 -1
  23. package/dist/assert/status.js +27 -3
  24. package/dist/asyncapi/browser.d.ts +7 -0
  25. package/dist/asyncapi/browser.js +6 -0
  26. package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
  27. package/dist/asyncapi/frame-check-worker-host.js +175 -0
  28. package/dist/asyncapi/frame-check-worker.d.ts +12 -0
  29. package/dist/asyncapi/frame-check-worker.js +25 -0
  30. package/dist/asyncapi/frame-check.d.ts +25 -0
  31. package/dist/asyncapi/frame-check.js +78 -0
  32. package/dist/asyncapi/import.d.ts +25 -0
  33. package/dist/asyncapi/import.js +34 -0
  34. package/dist/asyncapi/map.d.ts +40 -0
  35. package/dist/asyncapi/map.js +230 -0
  36. package/dist/asyncapi/model.d.ts +84 -0
  37. package/dist/asyncapi/model.js +7 -0
  38. package/dist/asyncapi/normalise-2.d.ts +13 -0
  39. package/dist/asyncapi/normalise-2.js +113 -0
  40. package/dist/asyncapi/normalise-3.d.ts +14 -0
  41. package/dist/asyncapi/normalise-3.js +133 -0
  42. package/dist/asyncapi/parse.d.ts +31 -0
  43. package/dist/asyncapi/parse.js +85 -0
  44. package/dist/asyncapi/read.d.ts +35 -0
  45. package/dist/asyncapi/read.js +186 -0
  46. package/dist/asyncapi/security.d.ts +14 -0
  47. package/dist/asyncapi/security.js +55 -0
  48. package/dist/asyncapi/update.d.ts +53 -0
  49. package/dist/asyncapi/update.js +220 -0
  50. package/dist/errors.d.ts +16 -0
  51. package/dist/errors.js +22 -0
  52. package/dist/grpc/events.d.ts +22 -0
  53. package/dist/grpc/events.js +1 -0
  54. package/dist/grpc/expand.d.ts +1 -1
  55. package/dist/grpc/expand.js +15 -5
  56. package/dist/grpc/files.d.ts +271 -0
  57. package/dist/grpc/files.js +62 -0
  58. package/dist/grpc/model.d.ts +11 -1
  59. package/dist/grpc/module.d.ts +2 -0
  60. package/dist/grpc/module.js +13 -0
  61. package/dist/grpc/run.d.ts +73 -0
  62. package/dist/grpc/run.js +407 -0
  63. package/dist/grpc/script-types.d.ts +8 -0
  64. package/dist/grpc/script-types.js +149 -0
  65. package/dist/grpc/scripting.d.ts +34 -0
  66. package/dist/grpc/scripting.js +147 -0
  67. package/dist/grpc/send-input.d.ts +46 -0
  68. package/dist/grpc/send-input.js +42 -0
  69. package/dist/grpc/send.d.ts +2 -2
  70. package/dist/grpc/status.d.ts +9 -2
  71. package/dist/grpc/status.js +11 -24
  72. package/dist/grpc/storage.d.ts +9 -0
  73. package/dist/grpc/storage.js +167 -0
  74. package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
  75. package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
  76. package/dist/http/auth/apply.d.ts +1 -1
  77. package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
  78. package/dist/{rest → http/auth}/oauth2.js +1 -1
  79. package/dist/http/auth/send-auth.d.ts +57 -0
  80. package/dist/http/auth/send-auth.js +7 -0
  81. package/dist/http/client.js +150 -8
  82. package/dist/http/cookies.d.ts +79 -0
  83. package/dist/http/cookies.js +81 -0
  84. package/dist/http/curl.d.ts +4 -14
  85. package/dist/http/curl.js +4 -154
  86. package/dist/http/decompress.d.ts +7 -0
  87. package/dist/http/decompress.js +23 -1
  88. package/dist/http/document-fetch.d.ts +42 -0
  89. package/dist/http/document-fetch.js +207 -0
  90. package/dist/http/entries.d.ts +27 -0
  91. package/dist/http/entries.js +16 -0
  92. package/dist/http/escape.d.ts +18 -0
  93. package/dist/http/escape.js +30 -0
  94. package/dist/http/fetch-document.d.ts +28 -0
  95. package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
  96. package/dist/http/media-type.d.ts +9 -0
  97. package/dist/http/media-type.js +12 -0
  98. package/dist/http/transcript-cap.d.ts +26 -0
  99. package/dist/http/transcript-cap.js +36 -0
  100. package/dist/http/types.d.ts +59 -0
  101. package/dist/http/webhook-signature.d.ts +81 -0
  102. package/dist/http/webhook-signature.js +227 -0
  103. package/dist/import-detect.d.ts +2 -2
  104. package/dist/import-detect.js +10 -1
  105. package/dist/index.d.ts +207 -55
  106. package/dist/index.js +129 -32
  107. package/dist/json/cursor.d.ts +2 -0
  108. package/dist/json/cursor.js +1 -0
  109. package/dist/json/pointer-range.d.ts +18 -0
  110. package/dist/json/pointer-range.js +157 -0
  111. package/dist/json/schema/model.d.ts +59 -0
  112. package/dist/json/schema/model.js +8 -0
  113. package/dist/json/schema/parse-text.d.ts +16 -0
  114. package/dist/json/schema/parse-text.js +37 -0
  115. package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
  116. package/dist/{rest/openapi → json/schema}/refs.js +3 -3
  117. package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
  118. package/dist/{rest/openapi → json/schema}/sample.js +2 -2
  119. package/dist/json/schema/source.d.ts +21 -0
  120. package/dist/json/schema/source.js +8 -0
  121. package/dist/json/schema-validate.d.ts +49 -0
  122. package/dist/json/schema-validate.js +557 -0
  123. package/dist/{wss/keystore → keystore}/index.js +1 -1
  124. package/dist/{wss/keystore → keystore}/pem.js +1 -1
  125. package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
  126. package/dist/project/attachments-cache.d.ts +3 -1
  127. package/dist/{wsdl → project}/cache-naming.js +1 -1
  128. package/dist/project/endpoints.d.ts +18 -8
  129. package/dist/project/endpoints.js +21 -6
  130. package/dist/project/environments.d.ts +7 -5
  131. package/dist/project/history.d.ts +105 -9
  132. package/dist/project/history.js +195 -23
  133. package/dist/project/inherit.d.ts +7 -0
  134. package/dist/project/inherit.js +9 -0
  135. package/dist/project/keystores.d.ts +1 -1
  136. package/dist/project/load-helpers.d.ts +89 -0
  137. package/dist/project/load-helpers.js +177 -0
  138. package/dist/project/load.d.ts +30 -4
  139. package/dist/project/load.js +168 -545
  140. package/dist/project/managed-files.d.ts +36 -0
  141. package/dist/project/managed-files.js +97 -0
  142. package/dist/project/migrate.d.ts +2 -2
  143. package/dist/project/migrate.js +2 -2
  144. package/dist/project/model.d.ts +92 -14
  145. package/dist/project/model.js +50 -4
  146. package/dist/project/paths.d.ts +10 -1
  147. package/dist/project/paths.js +10 -1
  148. package/dist/project/preferences.d.ts +11 -2
  149. package/dist/project/preferences.js +5 -1
  150. package/dist/project/properties.d.ts +31 -17
  151. package/dist/project/properties.js +89 -70
  152. package/dist/project/request-location.d.ts +20 -0
  153. package/dist/project/request-location.js +62 -0
  154. package/dist/project/save.d.ts +12 -2
  155. package/dist/project/save.js +186 -141
  156. package/dist/project/schema-parts.d.ts +337 -0
  157. package/dist/project/schema-parts.js +248 -0
  158. package/dist/project/schema.d.ts +72 -928
  159. package/dist/project/schema.js +17 -466
  160. package/dist/project/sequence-guards.d.ts +43 -0
  161. package/dist/project/sequence-guards.js +109 -0
  162. package/dist/project/serialize-helpers.d.ts +60 -0
  163. package/dist/project/serialize-helpers.js +108 -0
  164. package/dist/project/serialize.d.ts +7 -8
  165. package/dist/project/serialize.js +34 -293
  166. package/dist/protocol/features.d.ts +51 -0
  167. package/dist/protocol/features.js +64 -0
  168. package/dist/protocol/index.d.ts +7 -0
  169. package/dist/protocol/index.js +4 -0
  170. package/dist/protocol/module.d.ts +247 -0
  171. package/dist/protocol/module.js +48 -0
  172. package/dist/protocol/registry.d.ts +42 -0
  173. package/dist/protocol/registry.js +47 -0
  174. package/dist/protocols.d.ts +77 -0
  175. package/dist/protocols.js +40 -0
  176. package/dist/redact/index.d.ts +12 -1
  177. package/dist/redact/index.js +55 -7
  178. package/dist/redact/literal.d.ts +10 -0
  179. package/dist/redact/literal.js +110 -12
  180. package/dist/rest/body.d.ts +2 -10
  181. package/dist/rest/body.js +3 -25
  182. package/dist/rest/browser.d.ts +4 -0
  183. package/dist/rest/browser.js +5 -0
  184. package/dist/rest/contract-check-worker-host.d.ts +36 -0
  185. package/dist/rest/contract-check-worker-host.js +158 -0
  186. package/dist/rest/contract-check-worker.d.ts +7 -0
  187. package/dist/rest/contract-check-worker.js +28 -0
  188. package/dist/rest/contract-check.d.ts +43 -0
  189. package/dist/rest/contract-check.js +217 -0
  190. package/dist/rest/cookie-jar.d.ts +62 -0
  191. package/dist/rest/cookie-jar.js +262 -0
  192. package/dist/rest/cookies.d.ts +6 -22
  193. package/dist/rest/cookies.js +6 -42
  194. package/dist/rest/curl.js +5 -1
  195. package/dist/rest/events.d.ts +12 -0
  196. package/dist/rest/events.js +1 -0
  197. package/dist/rest/expand.d.ts +6 -1
  198. package/dist/rest/expand.js +29 -11
  199. package/dist/rest/files.d.ts +439 -0
  200. package/dist/rest/files.js +107 -0
  201. package/dist/rest/json-form.d.ts +97 -0
  202. package/dist/rest/json-form.js +396 -0
  203. package/dist/rest/model.d.ts +35 -24
  204. package/dist/rest/model.js +6 -9
  205. package/dist/rest/module.d.ts +2 -0
  206. package/dist/rest/module.js +13 -0
  207. package/dist/rest/openapi/cache.d.ts +7 -2
  208. package/dist/rest/openapi/cache.js +2 -2
  209. package/dist/rest/openapi/import.d.ts +11 -16
  210. package/dist/rest/openapi/import.js +6 -2
  211. package/dist/rest/openapi/map.d.ts +38 -1
  212. package/dist/rest/openapi/map.js +151 -41
  213. package/dist/rest/openapi/match.d.ts +20 -0
  214. package/dist/rest/openapi/match.js +117 -0
  215. package/dist/rest/openapi/model.d.ts +33 -45
  216. package/dist/rest/openapi/parse.d.ts +3 -12
  217. package/dist/rest/openapi/parse.js +138 -67
  218. package/dist/rest/openapi/responses.d.ts +23 -0
  219. package/dist/rest/openapi/responses.js +59 -0
  220. package/dist/rest/openapi/runtime-expression.d.ts +69 -0
  221. package/dist/rest/openapi/runtime-expression.js +213 -0
  222. package/dist/rest/openapi/update.d.ts +116 -0
  223. package/dist/rest/openapi/update.js +456 -0
  224. package/dist/rest/postman/map.d.ts +1 -0
  225. package/dist/rest/postman/map.js +66 -4
  226. package/dist/rest/postman/model.d.ts +9 -0
  227. package/dist/rest/postman/parse.js +33 -10
  228. package/dist/rest/response.d.ts +2 -23
  229. package/dist/rest/response.js +3 -75
  230. package/dist/rest/run.d.ts +56 -0
  231. package/dist/rest/run.js +395 -0
  232. package/dist/rest/script-types.d.ts +7 -0
  233. package/dist/rest/script-types.js +83 -0
  234. package/dist/rest/scripting.d.ts +38 -0
  235. package/dist/rest/scripting.js +282 -0
  236. package/dist/rest/send-input.d.ts +54 -0
  237. package/dist/rest/send-input.js +73 -0
  238. package/dist/rest/send.d.ts +77 -4
  239. package/dist/rest/send.js +128 -7
  240. package/dist/rest/sse-transcript.d.ts +25 -0
  241. package/dist/rest/sse-transcript.js +95 -0
  242. package/dist/rest/sse.d.ts +43 -0
  243. package/dist/rest/sse.js +195 -0
  244. package/dist/rest/storage.d.ts +26 -0
  245. package/dist/rest/storage.js +262 -0
  246. package/dist/rest/url.d.ts +10 -4
  247. package/dist/rest/url.js +38 -5
  248. package/dist/run/baseline-update.d.ts +35 -0
  249. package/dist/run/baseline-update.js +97 -0
  250. package/dist/run/baseline.d.ts +42 -0
  251. package/dist/run/baseline.js +93 -0
  252. package/dist/run/context.d.ts +86 -0
  253. package/dist/run/context.js +31 -0
  254. package/dist/run/current-values.d.ts +32 -0
  255. package/dist/run/current-values.js +43 -0
  256. package/dist/run/event-queue.d.ts +14 -0
  257. package/dist/run/event-queue.js +46 -0
  258. package/dist/run/exchange.d.ts +62 -0
  259. package/dist/run/exchange.js +65 -0
  260. package/dist/run/host.d.ts +89 -0
  261. package/dist/run/host.js +1 -0
  262. package/dist/run/index.d.ts +20 -7
  263. package/dist/run/index.js +12 -4
  264. package/dist/run/oauth2-token.d.ts +42 -0
  265. package/dist/run/oauth2-token.js +92 -0
  266. package/dist/run/open.d.ts +12 -0
  267. package/dist/run/open.js +16 -0
  268. package/dist/run/run.d.ts +124 -4
  269. package/dist/run/run.js +293 -134
  270. package/dist/run/scope.d.ts +11 -0
  271. package/dist/run/scope.js +26 -0
  272. package/dist/run/script-support.d.ts +53 -0
  273. package/dist/run/script-support.js +68 -0
  274. package/dist/run/secret-needs.d.ts +11 -4
  275. package/dist/run/secret-needs.js +48 -96
  276. package/dist/run/select.d.ts +34 -25
  277. package/dist/run/select.js +45 -54
  278. package/dist/run/send-helpers.d.ts +93 -0
  279. package/dist/run/send-helpers.js +255 -0
  280. package/dist/run/tree.d.ts +50 -0
  281. package/dist/run/tree.js +54 -0
  282. package/dist/script/api/postman.d.ts +10 -0
  283. package/dist/script/api/postman.js +264 -0
  284. package/dist/script/api/prelude.d.ts +20 -0
  285. package/dist/script/api/prelude.js +215 -0
  286. package/dist/script/apply.d.ts +44 -0
  287. package/dist/script/apply.js +120 -0
  288. package/dist/script/check/host.d.ts +41 -0
  289. package/dist/script/check/host.js +143 -0
  290. package/dist/script/check/service.d.ts +52 -0
  291. package/dist/script/check/service.js +195 -0
  292. package/dist/script/check/worker.d.ts +1 -0
  293. package/dist/script/check/worker.js +40 -0
  294. package/dist/script/index.d.ts +16 -0
  295. package/dist/script/index.js +10 -0
  296. package/dist/script/lookup.d.ts +10 -0
  297. package/dist/script/lookup.js +23 -0
  298. package/dist/script/model.d.ts +82 -0
  299. package/dist/script/model.js +18 -0
  300. package/dist/script/props.d.ts +8 -0
  301. package/dist/script/props.js +28 -0
  302. package/dist/script/request-scripts.d.ts +83 -0
  303. package/dist/script/request-scripts.js +160 -0
  304. package/dist/script/run.d.ts +47 -0
  305. package/dist/script/run.js +146 -0
  306. package/dist/script/sandbox/execute.d.ts +26 -0
  307. package/dist/script/sandbox/execute.js +212 -0
  308. package/dist/script/sandbox/host-api.d.ts +27 -0
  309. package/dist/script/sandbox/host-api.js +101 -0
  310. package/dist/script/sandbox/host.d.ts +18 -0
  311. package/dist/script/sandbox/host.js +172 -0
  312. package/dist/script/sandbox/model.d.ts +69 -0
  313. package/dist/script/sandbox/model.js +24 -0
  314. package/dist/script/sandbox/worker.d.ts +1 -0
  315. package/dist/script/sandbox/worker.js +20 -0
  316. package/dist/script/send.d.ts +27 -0
  317. package/dist/script/send.js +76 -0
  318. package/dist/script/strip.d.ts +5 -0
  319. package/dist/script/strip.js +43 -0
  320. package/dist/script/types/api.d.ts +38 -0
  321. package/dist/script/types/api.js +113 -0
  322. package/dist/script/types/json-schema.d.ts +26 -0
  323. package/dist/script/types/json-schema.js +206 -0
  324. package/dist/secrets/env-names.d.ts +9 -1
  325. package/dist/secrets/env-names.js +17 -1
  326. package/dist/secrets/resolve.d.ts +44 -4
  327. package/dist/secrets/resolve.js +58 -1
  328. package/dist/secrets/scan/apply.d.ts +36 -0
  329. package/dist/secrets/scan/apply.js +194 -0
  330. package/dist/secrets/scan/rules.d.ts +32 -0
  331. package/dist/secrets/scan/rules.js +346 -0
  332. package/dist/secrets/scan/scan.d.ts +6 -0
  333. package/dist/secrets/scan/scan.js +57 -0
  334. package/dist/secrets/scan/walk.d.ts +70 -0
  335. package/dist/secrets/scan/walk.js +156 -0
  336. package/dist/secrets/secret-refs.d.ts +8 -0
  337. package/dist/secrets/secret-refs.js +25 -0
  338. package/dist/secrets/secret-token.d.ts +17 -0
  339. package/dist/secrets/secret-token.js +25 -0
  340. package/dist/sequence/file.d.ts +169 -0
  341. package/dist/sequence/file.js +237 -0
  342. package/dist/sequence/index.d.ts +7 -0
  343. package/dist/sequence/index.js +5 -0
  344. package/dist/sequence/load.d.ts +32 -0
  345. package/dist/sequence/load.js +56 -0
  346. package/dist/sequence/model.d.ts +115 -0
  347. package/dist/sequence/model.js +53 -0
  348. package/dist/sequence/run.d.ts +131 -0
  349. package/dist/sequence/run.js +191 -0
  350. package/dist/sequence/transfer.d.ts +24 -0
  351. package/dist/sequence/transfer.js +75 -0
  352. package/dist/server-api/audit.d.ts +455 -0
  353. package/dist/server-api/audit.js +186 -0
  354. package/dist/server-api/ci-tokens.d.ts +50 -0
  355. package/dist/server-api/ci-tokens.js +35 -0
  356. package/dist/server-api/hooks.d.ts +337 -0
  357. package/dist/server-api/hooks.js +152 -0
  358. package/dist/server-api/identity.d.ts +210 -0
  359. package/dist/server-api/identity.js +115 -0
  360. package/dist/server-api/licensing.d.ts +80 -0
  361. package/dist/server-api/licensing.js +53 -0
  362. package/dist/server-api/live.d.ts +132 -0
  363. package/dist/server-api/live.js +102 -0
  364. package/dist/server-api/meta.d.ts +31 -0
  365. package/dist/server-api/meta.js +21 -0
  366. package/dist/server-api/sync.d.ts +179 -0
  367. package/dist/server-api/sync.js +124 -0
  368. package/dist/server-api/teams.d.ts +306 -0
  369. package/dist/server-api/teams.js +113 -0
  370. package/dist/snapshot/diff.d.ts +30 -0
  371. package/dist/snapshot/diff.js +75 -0
  372. package/dist/snapshot/format.d.ts +17 -0
  373. package/dist/snapshot/format.js +40 -0
  374. package/dist/snapshot/golden-file.d.ts +45 -0
  375. package/dist/snapshot/golden-file.js +173 -0
  376. package/dist/snapshot/ignore.d.ts +14 -0
  377. package/dist/snapshot/ignore.js +79 -0
  378. package/dist/snapshot/index.d.ts +9 -0
  379. package/dist/snapshot/index.js +9 -0
  380. package/dist/snapshot/json-diff.d.ts +3 -0
  381. package/dist/snapshot/json-diff.js +93 -0
  382. package/dist/snapshot/xml-diff.d.ts +10 -0
  383. package/dist/snapshot/xml-diff.js +194 -0
  384. package/dist/soap/auth.d.ts +26 -0
  385. package/dist/soap/auth.js +54 -0
  386. package/dist/soap/curl.d.ts +20 -0
  387. package/dist/soap/curl.js +161 -0
  388. package/dist/soap/expand.d.ts +24 -0
  389. package/dist/soap/expand.js +95 -0
  390. package/dist/soap/files.d.ts +384 -0
  391. package/dist/soap/files.js +114 -0
  392. package/dist/soap/form-request.d.ts +13 -0
  393. package/dist/soap/form-request.js +2 -2
  394. package/dist/soap/generate.d.ts +12 -0
  395. package/dist/{generate.js → soap/generate.js} +4 -4
  396. package/dist/{import.d.ts → soap/import.d.ts} +4 -4
  397. package/dist/{import.js → soap/import.js} +13 -13
  398. package/dist/soap/json-operation.d.ts +35 -0
  399. package/dist/soap/json-operation.js +225 -0
  400. package/dist/soap/legacy-project/env-refs.d.ts +19 -0
  401. package/dist/soap/legacy-project/env-refs.js +105 -0
  402. package/dist/soap/legacy-project/map.d.ts +2 -2
  403. package/dist/soap/legacy-project/map.js +6 -0
  404. package/dist/soap/mime/multipart.d.ts +2 -2
  405. package/dist/soap/mime/multipart.js +2 -5
  406. package/dist/soap/mime/send-pipeline.d.ts +1 -1
  407. package/dist/soap/mime/send-pipeline.js +1 -1
  408. package/dist/soap/mime/types.d.ts +1 -3
  409. package/dist/soap/module.d.ts +2 -0
  410. package/dist/soap/module.js +13 -0
  411. package/dist/soap/namespace-scope.js +1 -1
  412. package/dist/soap/operations.d.ts +12 -0
  413. package/dist/{operations.js → soap/operations.js} +4 -4
  414. package/dist/soap/run.d.ts +70 -0
  415. package/dist/soap/run.js +549 -0
  416. package/dist/soap/script-types.d.ts +65 -0
  417. package/dist/soap/script-types.js +379 -0
  418. package/dist/soap/scripting.d.ts +45 -0
  419. package/dist/soap/scripting.js +221 -0
  420. package/dist/soap/send-input.d.ts +61 -0
  421. package/dist/{send-options.js → soap/send-input.js} +5 -109
  422. package/dist/{send.d.ts → soap/send.d.ts} +1 -1
  423. package/dist/{send.js → soap/send.js} +28 -12
  424. package/dist/soap/storage.d.ts +9 -0
  425. package/dist/soap/storage.js +237 -0
  426. package/dist/soap/transforms.d.ts +3 -12
  427. package/dist/soap/transforms.js +3 -14
  428. package/dist/{types.d.ts → soap/types.d.ts} +34 -84
  429. package/dist/sync/git-cli.d.ts +202 -0
  430. package/dist/sync/git-cli.js +684 -0
  431. package/dist/sync/three-way-merge.d.ts +41 -0
  432. package/dist/sync/three-way-merge.js +85 -0
  433. package/dist/sync/tree-paths.d.ts +34 -0
  434. package/dist/sync/tree-paths.js +131 -0
  435. package/dist/team-secrets/envelope.d.ts +10 -0
  436. package/dist/team-secrets/envelope.js +121 -0
  437. package/dist/team-secrets/errors.d.ts +26 -0
  438. package/dist/team-secrets/errors.js +27 -0
  439. package/dist/team-secrets/index.d.ts +14 -0
  440. package/dist/team-secrets/index.js +8 -0
  441. package/dist/team-secrets/keys.d.ts +52 -0
  442. package/dist/team-secrets/keys.js +158 -0
  443. package/dist/team-secrets/log.d.ts +48 -0
  444. package/dist/team-secrets/log.js +175 -0
  445. package/dist/team-secrets/resolve-conflict.d.ts +7 -0
  446. package/dist/team-secrets/resolve-conflict.js +14 -0
  447. package/dist/team-secrets/schema.d.ts +97 -0
  448. package/dist/team-secrets/schema.js +157 -0
  449. package/dist/team-secrets/sign.d.ts +24 -0
  450. package/dist/team-secrets/sign.js +71 -0
  451. package/dist/team-secrets/vault.d.ts +49 -0
  452. package/dist/team-secrets/vault.js +148 -0
  453. package/dist/validate/wsi/run-message.d.ts +2 -2
  454. package/dist/validate/wsi/run-message.js +1 -1
  455. package/dist/validate/wsi/run-wsdl.d.ts +2 -2
  456. package/dist/validate/wsi/run-wsdl.js +1 -1
  457. package/dist/validate/wsi/types.d.ts +1 -1
  458. package/dist/webhooks/model.d.ts +138 -0
  459. package/dist/webhooks/model.js +150 -0
  460. package/dist/workspace/commit-message.d.ts +1 -1
  461. package/dist/workspace/commit-message.js +6 -1
  462. package/dist/workspace/environments.d.ts +11 -4
  463. package/dist/workspace/environments.js +12 -0
  464. package/dist/workspace/index.d.ts +3 -3
  465. package/dist/workspace/index.js +2 -2
  466. package/dist/workspace/paths.d.ts +5 -2
  467. package/dist/workspace/paths.js +5 -2
  468. package/dist/workspace/schema.d.ts +7 -3
  469. package/dist/workspace/schema.js +24 -3
  470. package/dist/workspace/share.d.ts +30 -11
  471. package/dist/workspace/share.js +32 -6
  472. package/dist/ws/call.d.ts +1 -1
  473. package/dist/ws/call.js +2 -2
  474. package/dist/ws/connect.d.ts +60 -0
  475. package/dist/ws/connect.js +131 -0
  476. package/dist/ws/events.d.ts +17 -0
  477. package/dist/ws/events.js +1 -0
  478. package/dist/ws/expand.d.ts +1 -1
  479. package/dist/ws/expand.js +1 -1
  480. package/dist/ws/files.d.ts +284 -0
  481. package/dist/ws/files.js +71 -0
  482. package/dist/ws/history-entry.d.ts +44 -0
  483. package/dist/ws/history-entry.js +93 -0
  484. package/dist/ws/model.d.ts +44 -3
  485. package/dist/ws/model.js +3 -0
  486. package/dist/ws/module.d.ts +2 -0
  487. package/dist/ws/module.js +11 -0
  488. package/dist/ws/run.d.ts +63 -0
  489. package/dist/ws/run.js +470 -0
  490. package/dist/ws/session.d.ts +18 -0
  491. package/dist/ws/session.js +52 -25
  492. package/dist/ws/storage.d.ts +9 -0
  493. package/dist/ws/storage.js +176 -0
  494. package/dist/ws/transcript.d.ts +3 -4
  495. package/dist/ws/transcript.js +26 -17
  496. package/dist/ws/url.d.ts +1 -1
  497. package/dist/wsdl/cache.js +1 -1
  498. package/dist/wsdl/docs-generator.d.ts +3 -3
  499. package/dist/wsdl/docs-generator.js +1 -1
  500. package/dist/wsdl/export-definition.js +1 -1
  501. package/dist/wsdl/qname.d.ts +2 -5
  502. package/dist/wsdl/resolver.d.ts +4 -11
  503. package/dist/wsdl/resolver.js +3 -3
  504. package/dist/wsdl/update-definition.d.ts +5 -5
  505. package/dist/wsdl/update-definition.js +6 -6
  506. package/dist/wss/apply.js +1 -1
  507. package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
  508. package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
  509. package/dist/wss/incoming/decrypt.d.ts +1 -1
  510. package/dist/wss/incoming/index.js +1 -1
  511. package/dist/wss/incoming/verify.d.ts +1 -1
  512. package/dist/wss/incoming/verify.js +1 -1
  513. package/dist/wss/key-identifiers.js +1 -1
  514. package/dist/wss/model.d.ts +1 -1
  515. package/dist/wss/outgoing/encryption.d.ts +1 -1
  516. package/dist/wss/outgoing/signature.d.ts +1 -1
  517. package/dist/xml/decode.d.ts +15 -0
  518. package/dist/xml/decode.js +22 -0
  519. package/dist/xml/entitize.d.ts +17 -0
  520. package/dist/xml/entitize.js +19 -0
  521. package/dist/xml/index.d.ts +1 -1
  522. package/dist/xml/index.js +1 -1
  523. package/dist/xml/locate.d.ts +39 -0
  524. package/dist/xml/locate.js +117 -0
  525. package/dist/xml/qname.d.ts +12 -0
  526. package/dist/xml/qname.js +8 -0
  527. package/dist/xpath/evaluate-async.d.ts +19 -0
  528. package/dist/xpath/evaluate-async.js +31 -11
  529. package/dist/xpath/evaluate.d.ts +1 -1
  530. package/dist/xpath/namespaces.js +1 -1
  531. package/dist/xpath/worker.d.ts +11 -5
  532. package/dist/xpath/worker.js +24 -7
  533. package/dist/xsd/form-model.d.ts +19 -2
  534. package/dist/xsd/form-model.js +14 -2
  535. package/dist/xsd/json-bridge.d.ts +152 -0
  536. package/dist/xsd/json-bridge.js +1213 -0
  537. package/dist/xsd/locate.d.ts +2 -30
  538. package/dist/xsd/locate.js +1 -109
  539. package/dist/xsd/xml-scan.d.ts +2 -0
  540. package/dist/xsd/xml-scan.js +1 -1
  541. package/dist/xsd/xml-writer.d.ts +2 -0
  542. package/dist/xsd/xml-writer.js +4 -0
  543. package/package.json +12 -1
  544. package/dist/generate.d.ts +0 -12
  545. package/dist/operations.d.ts +0 -12
  546. package/dist/run/effective-auth.d.ts +0 -10
  547. package/dist/run/effective-auth.js +0 -19
  548. package/dist/run/prepare.d.ts +0 -43
  549. package/dist/run/prepare.js +0 -280
  550. package/dist/send-options.d.ts +0 -141
  551. package/dist/wsdl/fetch.d.ts +0 -13
  552. /package/dist/{soap → http}/charset.d.ts +0 -0
  553. /package/dist/{soap → http}/charset.js +0 -0
  554. /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
  555. /package/dist/{wsdl → http}/ref-policy.js +0 -0
  556. /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
  557. /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
  558. /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
  559. /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
  560. /package/dist/{wss/keystore → keystore}/model.js +0 -0
  561. /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
  562. /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
  563. /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
  564. /package/dist/{types.js → soap/types.js} +0 -0
  565. /package/dist/{soap → xml}/prefixes.d.ts +0 -0
  566. /package/dist/{soap → xml}/prefixes.js +0 -0
@@ -0,0 +1,549 @@
1
+ /**
2
+ * SOAP's run facet (spec §3.3): which saved requests a run can send, how one is resolved and sent
3
+ * with and without scripts, its script types, and the secrets its configuration needs. A send loads
4
+ * the definition, resolves the request (its endpoint and secret tokens), runs its pre-request
5
+ * script, connects (its TLS identity, the proxy, its credentials with an OAuth2 token), then goes
6
+ * on the wire (spec §3.4).
7
+ */
8
+ import { readFile, stat } from 'node:fs/promises';
9
+ import { isAbsolute, resolve as resolvePath } from 'node:path';
10
+ import { WirebenchError } from '../errors.js';
11
+ import { createFileAttachmentResolver } from '../project/attachments-cache.js';
12
+ import { effectiveAuth } from '../project/endpoints.js';
13
+ import { resolveAuthEndpoint, resolveEndpoint } from '../project/environments.js';
14
+ import { definitionCacheDir } from '../project/paths.js';
15
+ import { expandSendInput } from './expand.js';
16
+ import { toWssIncomingConfig, toWssOutgoingConfig } from '../wss/configs.js';
17
+ import { scopesFor } from '../run/context.js';
18
+ import { exchangeController } from '../run/exchange.js';
19
+ import { requiredSecret } from '../run/oauth2-token.js';
20
+ import { authFor, dropRefusedToken, insideProject, keystoreFor, keystoreNeeds, originOf, present, reportedAuth, tlsFor, unresolvedError, withSecrets, } from '../run/send-helpers.js';
21
+ import { ORPHANED_STEP_REASON, byOrder } from '../run/tree.js';
22
+ import { applySoapSnapshot, soapRequestSnapshot, soapResponseSnapshot } from './scripting.js';
23
+ import { soapOperationElements, soapScriptTypes } from './script-types.js';
24
+ import { secretNeedsOfAuth } from '../secrets/env-names.js';
25
+ import { resolveSoapAuth } from '../secrets/resolve.js';
26
+ import { toSoapSendInput } from './send-input.js';
27
+ import { sendSoapRequest } from './send.js';
28
+ import { bindingContextFor, validateMessage } from '../validate/index.js';
29
+ import { resolveWorkspaceEndpoint, withActiveEnvironment } from '../workspace/environments.js';
30
+ import { effectiveWsa } from '../wsa/model.js';
31
+ import { summarizeWsa } from '../wsa/policy-detect.js';
32
+ import { readDefinitionCache } from '../wsdl/cache.js';
33
+ import { parseWsdlBundle } from '../wsdl/merge.js';
34
+ import { createWssContext } from '../wss/model.js';
35
+ import { buildSchemaSet } from '../xsd/schema-set.js';
36
+ /** A SOAP request's own auth, combined with its endpoint's, falling back to the interface's. */
37
+ export function soapEffectiveAuth(selected) {
38
+ const { iface, request } = selected;
39
+ const endpoint = resolveAuthEndpoint(iface, request);
40
+ return effectiveAuth(request.auth, endpoint?.auth, endpoint?.authMode ?? 'override', iface.auth);
41
+ }
42
+ /** A SOAP request's endpoint, through the workspace's environment when the run has a workspace. */
43
+ function endpointFor(context, iface, request) {
44
+ const { project, environmentId, workspace } = context;
45
+ return workspace === undefined
46
+ ? resolveEndpoint(project, environmentId, iface, request)
47
+ : resolveWorkspaceEndpoint({
48
+ workspace: withActiveEnvironment(workspace.workspace, environmentId),
49
+ project,
50
+ projectSlug: workspace.projectSlug,
51
+ iface,
52
+ request,
53
+ });
54
+ }
55
+ /**
56
+ * WS-Addressing as the app's `wsaFor` builds it. The WSDL-derived default action comes from the
57
+ * host's `defaultWsaActionFor`; without one it is empty, as it is in the app for an interface not
58
+ * yet hydrated, and an explicit `wsa:Action` or the request's SOAPAction still applies.
59
+ */
60
+ function wsaFor(selected, context) {
61
+ const config = effectiveWsa(selected.iface.wsa, selected.request.wsa);
62
+ return config.enabled ? { config, defaultAction: context.defaultWsaActionFor?.(selected) ?? '' } : undefined;
63
+ }
64
+ /** The app's `wssFor`: a selected configuration the project no longer has refuses the send. */
65
+ function wssFor(selected, context) {
66
+ const { request } = selected;
67
+ const pick = (id) => (id === undefined || id.length === 0 ? undefined : id);
68
+ const outgoingId = pick(request.wssOutgoingRef);
69
+ const incomingId = pick(request.wssIncomingRef);
70
+ if (outgoingId === undefined && incomingId === undefined) {
71
+ return undefined;
72
+ }
73
+ const find = (refs, id, convert) => {
74
+ const ref = refs.find((candidate) => candidate.id === id);
75
+ if (ref !== undefined) {
76
+ try {
77
+ return convert(ref);
78
+ }
79
+ catch {
80
+ // An unreadable configuration is treated as the app treats it: as missing.
81
+ }
82
+ }
83
+ throw new WirebenchError('wss-config-missing', 'This request selects a WS-Security configuration the project no longer has.', { details: { configId: id } });
84
+ };
85
+ const outgoing = outgoingId === undefined ? undefined : find(context.project.wss.outgoing, outgoingId, toWssOutgoingConfig);
86
+ const incoming = incomingId === undefined ? undefined : find(context.project.wss.incoming, incomingId, toWssIncomingConfig);
87
+ const { properties } = request;
88
+ return {
89
+ ...(outgoing !== undefined ? { outgoing } : {}),
90
+ ...(incoming !== undefined ? { incoming } : {}),
91
+ ctx: createWssContext({
92
+ keystores: (ref) => keystoreFor(context, ref),
93
+ secrets: (ref) => requiredSecret(ref, context.host.getSecret),
94
+ }),
95
+ requestProperties: {
96
+ ...(properties.wssPasswordType !== undefined ? { wssPasswordType: properties.wssPasswordType } : {}),
97
+ ...(properties.wssTimeToLive !== undefined ? { wssTimeToLive: properties.wssTimeToLive } : {}),
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * The app's `attachmentResolvers`, with the project folder as the only read boundary: a `cache`
103
+ * attachment comes out of `attachments/`, a `path` one from its first existing candidate (resource
104
+ * root, then the project), and an inline `file:` reference from the project folder.
105
+ */
106
+ function attachmentResolvers(context) {
107
+ const { projectDir } = context;
108
+ const resourceRoot = context.project.settings.resourceRoot;
109
+ const read = createFileAttachmentResolver(projectDir, resourceRoot);
110
+ return {
111
+ resolver: async (attachment) => {
112
+ if (attachment.source.kind === 'path') {
113
+ const { path } = attachment.source;
114
+ const candidates = isAbsolute(path)
115
+ ? [path]
116
+ : [...(resourceRoot !== undefined ? [resolvePath(resourceRoot, path)] : []), resolvePath(projectDir, path)];
117
+ for (const candidate of candidates) {
118
+ const exists = await stat(candidate).then(() => true, () => false);
119
+ if (exists) {
120
+ await insideProject(context, candidate, 'attachment-outside-project', attachment.name);
121
+ return new Uint8Array(await readFile(candidate));
122
+ }
123
+ }
124
+ }
125
+ return read(attachment);
126
+ },
127
+ resolveFile: async (path) => new Uint8Array(await readFile(await insideProject(context, path, 'inline-file-outside-project', path))),
128
+ resourceRoot: projectDir,
129
+ };
130
+ }
131
+ /** A SOAP request's endpoint (the override's when it names one), refused when nothing resolves one. */
132
+ function requiredEndpoint(selected, context) {
133
+ const resolved = endpointFor(context, selected.iface, selected.request);
134
+ // The configured endpoint stays: its trust decision applies to the URL the editor resolved from it.
135
+ const url = selected.override?.endpoint ?? resolved.url;
136
+ if (url === undefined) {
137
+ throw new WirebenchError('endpoint-unresolved', `No endpoint resolves for "${selected.path}"`, {
138
+ details: { path: selected.path },
139
+ });
140
+ }
141
+ return { ...resolved, url };
142
+ }
143
+ /**
144
+ * One SOAP request resolved (spec §3.4): its endpoint, WS-Addressing, its WS-Security
145
+ * configuration and its secret tokens (behind `context.secretPlaceholders` when given), nothing
146
+ * connected and the credentials still as configured, so the input holds no `auth`. A reference
147
+ * nothing resolves is reported in `unresolved`, not thrown: the send refuses it, a preview shows it.
148
+ *
149
+ * @throws WirebenchError `endpoint-unresolved` | `secret-missing` | `wss-config-missing`
150
+ */
151
+ export async function resolveSoap(selected, context) {
152
+ const { request, override } = selected;
153
+ const resolved = requiredEndpoint(selected, context);
154
+ const preferences = context.host.preferences;
155
+ const base = toSoapSendInput({
156
+ request: {
157
+ properties: request.properties,
158
+ soapVersion: request.soapVersion,
159
+ ...(request.soapAction !== undefined ? { soapAction: request.soapAction } : {}),
160
+ headers: override?.headers !== undefined
161
+ ? Object.entries(override.headers).map(([name, value]) => ({ name, value }))
162
+ : request.headers,
163
+ envelopeXml: override?.envelopeXml ?? request.envelopeXml,
164
+ },
165
+ endpoint: resolved.url,
166
+ ...(preferences !== undefined ? { preferences } : {}),
167
+ projectSettings: context.project.settings,
168
+ attachments: request.attachments,
169
+ attachmentResolvers: attachmentResolvers(context),
170
+ });
171
+ const scopes = scopesFor(context);
172
+ const wsa = wsaFor(selected, context);
173
+ const wss = wssFor(selected, context);
174
+ // The attachments and MTOM options ride on `base`, as the app's `sendAttachmentsFor` builds them.
175
+ const input = {
176
+ ...base,
177
+ ...(override?.tlsMinVersion !== undefined ? { tls: { ...base.tls, minVersion: override.tlsMinVersion } } : {}),
178
+ ...(override?.compressBody !== undefined ? { compressBody: override.compressBody } : {}),
179
+ ...(override?.allowH2 !== undefined ? { allowH2: override.allowH2 } : {}),
180
+ ...(context.timeoutMs !== undefined ? { timeoutMs: context.timeoutMs } : {}),
181
+ ...(wsa !== undefined ? { wsa } : {}),
182
+ ...(wss !== undefined ? { wss } : {}),
183
+ ...(context.signal !== undefined ? { signal: context.signal } : {}),
184
+ };
185
+ const withTokens = await withSecrets(input, scopes, context.host.getSecret, context.secretPlaceholders);
186
+ // Reported here, before the wire: the engine would report the same refs on the exchange, but by
187
+ // then a half-expanded envelope has already been sent to somebody's service.
188
+ const { unresolved } = expandSendInput(input, withTokens);
189
+ return { input, scopes: withTokens, unresolved };
190
+ }
191
+ /**
192
+ * The request's TLS identity and trust decision, the proxy for its endpoint, and its credentials
193
+ * (an OAuth2 token included), over a resolved input: what a send does after its pre-request
194
+ * script, so the script never sees a credential (spec §7).
195
+ *
196
+ * @throws WirebenchError `secret-missing` | `auth-grant-unsupported` | `keystore-missing`
197
+ */
198
+ export async function connectSoap(selected, context, input) {
199
+ const { request } = selected;
200
+ const resolved = requiredEndpoint(selected, context);
201
+ const owner = soapEffectiveAuth(selected);
202
+ const tls = await tlsFor(context, request.properties.sslKeystoreRef, resolved.endpoint?.trustInvalid === true);
203
+ const proxy = await context.host.proxyFor?.(input.endpoint);
204
+ // An owner's OAuth2 gets its token as a REST one does (client credentials; the browser grant is
205
+ // refused); the endpoint schemes resolve through the SOAP path.
206
+ const sendAuth = owner !== undefined && owner.type === 'oauth2'
207
+ ? await authFor(owner, selected.path, context, tls)
208
+ : reportedAuth(await resolveSoapAuth(owner, context.host.getSecret), context);
209
+ return {
210
+ ...input,
211
+ ...(sendAuth !== undefined ? { auth: sendAuth } : {}),
212
+ ...(tls !== undefined ? { tls: { ...input.tls, ...tls } } : {}),
213
+ ...(proxy !== undefined ? { proxy } : {}),
214
+ };
215
+ }
216
+ function parseClark(clark) {
217
+ const match = /^\{([^}]*)\}(.*)$/.exec(clark);
218
+ return match === null
219
+ ? { namespaceUri: '', localName: clark }
220
+ : { namespaceUri: match[1] ?? '', localName: match[2] ?? '' };
221
+ }
222
+ /**
223
+ * Reads the interface's definition from `interfaces/<slug>/definition/`, as the app hydrates it
224
+ * with `prefer-cache` — minus the network fallback: a run never fetches a WSDL. An interface that
225
+ * does not cache its definition, or whose cache is absent or unreadable, has no contract here.
226
+ */
227
+ async function loadDefinition(projectDir, iface) {
228
+ if (!iface.cacheDefinition) {
229
+ return undefined;
230
+ }
231
+ try {
232
+ const bundle = await readDefinitionCache(definitionCacheDir(projectDir, iface.slug));
233
+ const definition = parseWsdlBundle(bundle);
234
+ return {
235
+ definition,
236
+ bundle,
237
+ schemaSet: buildSchemaSet(bundle),
238
+ defaultActionByOperation: summarizeWsa(definition).defaultActionByOperation,
239
+ };
240
+ }
241
+ catch {
242
+ return undefined;
243
+ }
244
+ }
245
+ /**
246
+ * A SOAP response as assertions and sequence transfers see it, without contract validation: what a
247
+ * host that has no compiled definition at hand (the desktop's sequence runner) can build from the
248
+ * exchange alone.
249
+ */
250
+ export function soapResponseSubject(exchange) {
251
+ const fault = exchange.response?.fault;
252
+ return {
253
+ protocol: 'soap',
254
+ status: exchange.http.status,
255
+ durationMs: exchange.durationMs,
256
+ bodyText: exchange.response?.envelopeXml ?? new TextDecoder().decode(exchange.http.body),
257
+ bodyKind: exchange.response?.isSoap === true ? 'xml' : 'other',
258
+ headers: exchange.http.rawHeaders,
259
+ fault: {
260
+ present: fault !== undefined,
261
+ ...(fault !== undefined ? { summary: [fault.code, fault.reason].filter((s) => s.length > 0).join(' — ') } : {}),
262
+ },
263
+ };
264
+ }
265
+ /** A SOAP response as assertions see it, validated against the contract when the run has the definition. */
266
+ function soapSubject(exchange, loaded, item) {
267
+ const base = soapResponseSubject(exchange);
268
+ const bodyText = base.bodyText;
269
+ const binding = loaded === undefined
270
+ ? undefined
271
+ : bindingContextFor(loaded.definition, { bindingName: parseClark(item.operation.bindingName), operationName: item.operation.name }, 'response');
272
+ const contentType = exchange.http.headers['content-type'];
273
+ return {
274
+ ...base,
275
+ ...(loaded !== undefined && binding !== undefined
276
+ ? {
277
+ validateContract: () => validateMessage({
278
+ xml: bodyText,
279
+ direction: 'response',
280
+ schemaSet: loaded.schemaSet,
281
+ bundle: loaded.bundle,
282
+ binding,
283
+ http: { ...(contentType !== undefined ? { contentType } : {}) },
284
+ }).then((r) => r.problems),
285
+ }
286
+ : {}),
287
+ };
288
+ }
289
+ /** Parses a WS-Security configuration by id; missing or unreadable is resolve's error, not a need. */
290
+ function findConfig(refs, id, convert) {
291
+ if (!present(id)) {
292
+ return undefined;
293
+ }
294
+ const ref = refs.find((candidate) => candidate.id === id);
295
+ if (ref === undefined) {
296
+ return undefined;
297
+ }
298
+ try {
299
+ return convert(ref);
300
+ }
301
+ catch {
302
+ return undefined;
303
+ }
304
+ }
305
+ /** WS-Security passwords carry no `…Env` name: they resolve through their ref-derived variable. */
306
+ function outgoingNeeds(project, config) {
307
+ const needs = [];
308
+ for (const entry of config.entries) {
309
+ if (entry.kind === 'username-token') {
310
+ const ref = entry.passwordRef ?? config.defaultPasswordRef;
311
+ if (entry.passwordType !== 'none' && present(ref)) {
312
+ needs.push({ ref, purpose: `WS-Security password for "${entry.username}"` });
313
+ }
314
+ }
315
+ else if (entry.kind === 'signature') {
316
+ needs.push(...keystoreNeeds(project, entry.keystoreRef));
317
+ if (present(entry.keyPasswordRef)) {
318
+ needs.push({ ref: entry.keyPasswordRef, purpose: `WS-Security signing key password ("${config.name}")` });
319
+ }
320
+ }
321
+ else if (entry.kind === 'encryption') {
322
+ needs.push(...keystoreNeeds(project, entry.keystoreRef));
323
+ }
324
+ }
325
+ return needs;
326
+ }
327
+ function incomingNeeds(project, config) {
328
+ return [
329
+ ...keystoreNeeds(project, config.decryptKeystoreRef),
330
+ ...(present(config.decryptKeyPasswordRef)
331
+ ? [{ ref: config.decryptKeyPasswordRef, purpose: `WS-Security decryption key password ("${config.name}")` }]
332
+ : []),
333
+ ...keystoreNeeds(project, config.signatureKeystoreRef),
334
+ ];
335
+ }
336
+ /** The definition the host holds for the request's interface, else the cached one, read once per run scope. */
337
+ function definitionFor(selected, scope) {
338
+ const held = scope.context.loadedDefinitionFor?.(selected);
339
+ if (held !== undefined) {
340
+ return Promise.resolve({
341
+ definition: held.definition,
342
+ bundle: held.bundle,
343
+ schemaSet: held.schemaSet,
344
+ defaultActionByOperation: held.wsa.defaultActionByOperation,
345
+ });
346
+ }
347
+ const { iface } = selected;
348
+ return scope.memo(`soap:${iface.id}:definition`, () => loadDefinition(scope.context.projectDir, iface));
349
+ }
350
+ /** The run's context for one SOAP item: the WSDL's default `wsa:Action`, when the run has the definition. */
351
+ async function soapContextFor(selected, scope, base) {
352
+ const loaded = await definitionFor(selected, scope);
353
+ // A host's own answer wins (the app's definition in memory, cached on disk or not); the cached
354
+ // definition answers when the host has none.
355
+ const lent = base.defaultWsaActionFor;
356
+ const cached = loaded === undefined
357
+ ? undefined
358
+ : (s) => loaded.defaultActionByOperation[`${s.operation.bindingName}|${s.operation.name}`] ?? '';
359
+ const context = {
360
+ ...base,
361
+ ...(lent !== undefined || cached !== undefined
362
+ ? {
363
+ defaultWsaActionFor: (s) => {
364
+ const own = lent?.(s) ?? '';
365
+ return own.length > 0 ? own : (cached?.(s) ?? '');
366
+ },
367
+ }
368
+ : {}),
369
+ };
370
+ return { context, loaded };
371
+ }
372
+ /** What a failed send was about to put on the wire: the endpoint, POST, the request's headers. */
373
+ function attemptedOf(input) {
374
+ return { url: input.endpoint, method: 'POST', headers: input.headers ?? {} };
375
+ }
376
+ /**
377
+ * One SOAP request as a run sends it (spec §3.4): resolve, run its pre-request script when
378
+ * `scripts` is given, connect, send, then its post-response script. The host is told of a failure
379
+ * once the endpoint is known: a `prepare` one before the request goes out, a `send` one after.
380
+ * Either carries the request as resolved (`input`), references unexpanded, which is what a host
381
+ * records; the sent exchange carries it too.
382
+ */
383
+ async function sendSoapItem(selected, scope, base, scripts) {
384
+ const { context, loaded } = await soapContextFor(selected, scope, base);
385
+ const endpoint = requiredEndpoint(selected, context).url;
386
+ let startedAt = Date.now();
387
+ let resolvedInput;
388
+ // Never masks the send's own error: a row that cannot be built, or a host that throws, is dropped.
389
+ const failed = (stage, error, attempted) => {
390
+ try {
391
+ context.host.events?.onFailed?.(selected, {
392
+ stage,
393
+ error,
394
+ startedAt,
395
+ durationMs: Date.now() - startedAt,
396
+ attempted: attempted !== undefined ? attemptedOf(attempted) : { url: endpoint, method: 'POST', headers: {} },
397
+ ...(resolvedInput !== undefined ? { input: resolvedInput } : {}),
398
+ });
399
+ }
400
+ catch {
401
+ // Deliberately ignored — see above.
402
+ }
403
+ };
404
+ let prepared;
405
+ try {
406
+ prepared = await prepareSoap(selected, context, scripts, (input) => {
407
+ resolvedInput = input;
408
+ });
409
+ }
410
+ catch (error) {
411
+ failed('prepare', error, resolvedInput);
412
+ throw error;
413
+ }
414
+ const { input, connected, scopes, snapshot } = prepared;
415
+ startedAt = Date.now();
416
+ let exchange;
417
+ try {
418
+ exchange = await sendSoapRequest(connected, scopes !== undefined ? { scopes } : {});
419
+ }
420
+ catch (error) {
421
+ failed('send', error, input);
422
+ throw error;
423
+ }
424
+ dropRefusedToken(context, connected.auth, exchange.http.status === 401);
425
+ const sent = {
426
+ subject: soapSubject(exchange, loaded, selected),
427
+ raw: exchange.http,
428
+ exchange: { kind: 'soap', soap: exchange, input },
429
+ ...originOf(exchange.http.request.url),
430
+ };
431
+ return scripts === undefined || snapshot === undefined
432
+ ? sent
433
+ : { ...sent, script: await scripts.session.post(snapshot, soapResponseSnapshot(exchange)) };
434
+ }
435
+ /** Resolves, runs the pre-request script when there is one, and connects; `onResolved` hears the input first. */
436
+ async function prepareSoap(selected, context, scripts, onResolved) {
437
+ if (scripts === undefined) {
438
+ const resolved = await resolveSoap(selected, context);
439
+ onResolved(resolved.input);
440
+ if (resolved.unresolved.length > 0) {
441
+ throw unresolvedError('unresolved-properties', selected.path, resolved.unresolved);
442
+ }
443
+ const connected = await connectSoap(selected, context, resolved.input);
444
+ return { input: resolved.input, connected, scopes: resolved.scopes };
445
+ }
446
+ // Resolved with its secrets behind placeholders; the pre-request script runs on the expanded
447
+ // request, the secrets are put back, and the post-response script sees what the script left.
448
+ const resolved = await resolveSoap(selected, { ...context, secretPlaceholders: scripts.placeholders });
449
+ onResolved(resolved.input);
450
+ if (resolved.unresolved.length > 0) {
451
+ throw unresolvedError('unresolved-properties', selected.path, resolved.unresolved);
452
+ }
453
+ const expanded = expandSendInput(resolved.input, resolved.scopes, {
454
+ entitize: resolved.input.entitize ?? false,
455
+ }).input;
456
+ const snapshot = await scripts.session.pre(soapRequestSnapshot(expanded));
457
+ const changed = applySoapSnapshot(expanded, snapshot);
458
+ const restored = await scripts.placeholders.restore({
459
+ endpoint: changed.endpoint,
460
+ headers: changed.headers ?? {},
461
+ envelopeXml: changed.envelopeXml,
462
+ ...(changed.soapAction !== undefined ? { soapAction: changed.soapAction } : {}),
463
+ }, context.host.getSecret);
464
+ // Already expanded: sent without scopes, so nothing the script wrote is expanded again.
465
+ const connected = await connectSoap(selected, context, { ...changed, ...restored });
466
+ return { input: resolved.input, connected, snapshot };
467
+ }
468
+ /**
469
+ * The SOAP item for `requestId`, built as a run builds it — and found even when its definition no
470
+ * longer has it (`orphaned`), which a run skips and a person may still send. Undefined when no SOAP
471
+ * request has that id.
472
+ */
473
+ export function soapItemFor(project, requestId) {
474
+ for (const iface of project.interfaces) {
475
+ for (const operation of iface.operations) {
476
+ const request = operation.requests.find((candidate) => candidate.id === requestId);
477
+ if (request !== undefined) {
478
+ const group = `${iface.name}/${operation.name}`;
479
+ return { kind: 'soap', path: `${group}/${request.name}`, group, iface, operation, request };
480
+ }
481
+ }
482
+ }
483
+ return undefined;
484
+ }
485
+ /** SOAP's run facet. */
486
+ export const soapRun = {
487
+ groups(project) {
488
+ return project.interfaces.map((iface) => ({
489
+ order: iface.order,
490
+ name: iface.name,
491
+ candidates: [...iface.operations].sort(byOrder).flatMap((operation) => {
492
+ const group = `${iface.name}/${operation.name}`;
493
+ return [...operation.requests]
494
+ .sort(byOrder)
495
+ .filter((request) => request.orphaned !== true)
496
+ .map((request) => ({
497
+ item: { kind: 'soap', path: `${group}/${request.name}`, group, iface, operation, request },
498
+ diskPath: `interfaces/${iface.slug}/operations/${operation.slug}/${request.slug}`,
499
+ }));
500
+ }),
501
+ }));
502
+ },
503
+ whyNotRunnable(project, requestId) {
504
+ for (const iface of project.interfaces) {
505
+ for (const operation of iface.operations) {
506
+ const request = operation.requests.find((candidate) => candidate.id === requestId);
507
+ if (request !== undefined) {
508
+ return request.orphaned === true ? ORPHANED_STEP_REASON : undefined;
509
+ }
510
+ }
511
+ }
512
+ return undefined;
513
+ },
514
+ open(selected, scope, host, options) {
515
+ const controller = exchangeController('soap', options);
516
+ const context = { ...scope.context, host, signal: controller.signal };
517
+ return controller.handle(() => sendSoapItem(selected, scope, context, options.scripts));
518
+ },
519
+ async resolve(selected, scope, host) {
520
+ const { context } = await soapContextFor(selected, scope, { ...scope.context, host });
521
+ return resolveSoap(selected, context);
522
+ },
523
+ async scriptTypes(selected, scope) {
524
+ const loaded = await definitionFor(selected, scope);
525
+ if (loaded === undefined) {
526
+ return { generated: soapScriptTypes(undefined) };
527
+ }
528
+ const elements = soapOperationElements(loaded.definition, selected.operation.bindingName, selected.operation.name);
529
+ return {
530
+ generated: soapScriptTypes(loaded.schemaSet, elements.input, elements.output),
531
+ binding: {
532
+ schemas: loaded.schemaSet,
533
+ ...(elements.input !== undefined ? { input: elements.input } : {}),
534
+ ...(elements.output !== undefined ? { output: elements.output } : {}),
535
+ },
536
+ };
537
+ },
538
+ secretNeeds(selected, project) {
539
+ const { request } = selected;
540
+ const outgoing = findConfig(project.wss.outgoing, request.wssOutgoingRef, toWssOutgoingConfig);
541
+ const incoming = findConfig(project.wss.incoming, request.wssIncomingRef, toWssIncomingConfig);
542
+ return [
543
+ ...secretNeedsOfAuth(soapEffectiveAuth(selected)),
544
+ ...keystoreNeeds(project, request.properties.sslKeystoreRef),
545
+ ...(outgoing !== undefined ? outgoingNeeds(project, outgoing) : []),
546
+ ...(incoming !== undefined ? incomingNeeds(project, incoming) : []),
547
+ ];
548
+ },
549
+ };
@@ -0,0 +1,65 @@
1
+ /**
2
+ * SOAP script types and the XML projection they describe (spec §Types, SOAP).
3
+ *
4
+ * One walk over the schema serves three uses:
5
+ * - `soapScriptTypes` declares `WbSoapRequestBody` / `WbSoapResponseBody` from the operation's input
6
+ * and output elements;
7
+ * - `projectXml` turns the body element of an envelope into the object those types describe;
8
+ * - `serializeProjection` turns such an object back into XML, in schema order.
9
+ *
10
+ * The mapping: an element is a field named by its local name (by `{namespace}local` when two
11
+ * children of one parent share a local name); `maxOccurs > 1` (on it or an enclosing compositor)
12
+ * is an array; `minOccurs="0"`, or sitting in a choice, is optional; `nillable` adds `| null`; an
13
+ * attribute is `"@name"`; the text of a simple-content element with attributes is `"#text"`;
14
+ * `xs:any` is not projected. `xs:boolean` is a boolean, the 32-bit and floating-point numbers are
15
+ * numbers, and `xs:long`, `xs:integer` and `xs:decimal` stay strings, since a number would lose
16
+ * precision. An enumeration is a union of literals. Mixed content is not projected.
17
+ */
18
+ import type { QName } from '../wsdl/qname.js';
19
+ import { type WsdlDefinition } from '../wsdl/model.js';
20
+ import type { ElementDecl, Particle } from '../xsd/model.js';
21
+ import type { SchemaSet } from '../xsd/schema-set.js';
22
+ import { type ScannedElement } from '../xsd/xml-scan.js';
23
+ /** One child element a complex type can hold. */
24
+ export interface ElementSlot {
25
+ /** The key it has in the projection. */
26
+ readonly key: string;
27
+ readonly decl: ElementDecl;
28
+ readonly many: boolean;
29
+ readonly optional: boolean;
30
+ }
31
+ /** The child elements a content particle allows, in schema order. */
32
+ export declare function elementSlots(set: SchemaSet, particle: Particle | undefined): ElementSlot[];
33
+ /** `WbSoapRequestBody` and `WbSoapResponseBody` for an operation's input and output elements. */
34
+ export declare function soapScriptTypes(set: SchemaSet | undefined, input?: QName, output?: QName): string;
35
+ /** The value `element` holds as `decl` describes it. */
36
+ export declare function projectElement(set: SchemaSet, decl: ElementDecl, element: ScannedElement, depth?: number): unknown;
37
+ /**
38
+ * `value` as the XML for `decl`, children in schema order. A namespace is declared as the default
39
+ * wherever it changes from the parent's, so the fragment stands on its own inside any envelope.
40
+ *
41
+ * @throws TypeError when `value` does not have the shape the schema needs
42
+ */
43
+ export declare function serializeElement(set: SchemaSet, decl: ElementDecl, value: unknown, parentNamespace: string | undefined, depth?: number): string;
44
+ /** The first element inside the envelope's SOAP Body, if the envelope has one. */
45
+ export declare function soapBodyElement(envelope: string): ScannedElement | undefined;
46
+ /** The projection of the envelope's body element, when `element` names its declaration. */
47
+ export declare function projectSoapBody(set: SchemaSet | undefined, element: QName | undefined, envelope: string): unknown;
48
+ /**
49
+ * The envelope with its body element replaced by `value` written as `element`. Everything outside
50
+ * the body element is kept byte for byte.
51
+ *
52
+ * @throws TypeError when the envelope has no body element or `value` does not fit the schema
53
+ */
54
+ export declare function replaceSoapBody(set: SchemaSet, element: QName, envelope: string, value: unknown): string;
55
+ /** `{namespace}local` as a QName. */
56
+ export declare function qnameFromClark(clark: string): QName;
57
+ /**
58
+ * The elements a document-style SOAP operation's input and output messages name, when each message
59
+ * has exactly one element part — the shape a typed body needs. An RPC-style operation, or a message
60
+ * of type parts, has none.
61
+ */
62
+ export declare function soapOperationElements(definition: WsdlDefinition, bindingName: string, operationName: string): {
63
+ readonly input?: QName;
64
+ readonly output?: QName;
65
+ };