@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,62 @@
1
+ /**
2
+ * The gRPC files of a project folder: `apis/<slug>/api.yaml` with `kind: grpc`, and each
3
+ * `*.request.yaml` of its request tree (spec §3.2).
4
+ */
5
+ import { z } from 'zod';
6
+ import { assertionsSchema } from '../assert/schema.js';
7
+ import { authConfigSchema, keyValueEntrySchema, nonEmpty, scriptsSchema } from '../project/schema-parts.js';
8
+ const grpcSettingsSchema = z.looseObject({
9
+ timeoutMs: z.number().int().nonnegative().optional(),
10
+ trustInvalid: z.boolean().optional(),
11
+ sslKeystoreRef: z.string().optional(),
12
+ bindAddress: z.string().optional(),
13
+ maxSizeBytes: z.number().int().nonnegative().optional(),
14
+ escapeProperties: z.boolean().optional(),
15
+ });
16
+ /** The four shapes a gRPC method can take. */
17
+ export const grpcMethodKindSchema = z.enum(['unary', 'server-streaming', 'client-streaming', 'bidi-streaming']);
18
+ /**
19
+ * `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a gRPC request. The message text lives
20
+ * in the sibling file `message` names, validated as a path segment before it is read (ADR-0005),
21
+ * so a JSON message is a JSON file in git like a REST raw body.
22
+ */
23
+ export const grpcRequestFileSchema = z.looseObject({
24
+ kind: z.literal('grpc'),
25
+ id: nonEmpty,
26
+ name: z.string(),
27
+ order: z.number().int(),
28
+ description: z.string().optional(),
29
+ service: z.string(),
30
+ method: z.string(),
31
+ methodKind: grpcMethodKindSchema.default('unary'),
32
+ metadata: z.array(keyValueEntrySchema).default([]),
33
+ message: nonEmpty.optional(),
34
+ auth: authConfigSchema.default({ type: 'inherit' }),
35
+ settings: grpcSettingsSchema.default({}),
36
+ orphaned: z.boolean().optional(),
37
+ assertions: assertionsSchema.default([]),
38
+ scripts: scriptsSchema.optional(),
39
+ });
40
+ /** `apis/<slug>/api.yaml` for a gRPC API. */
41
+ export const grpcApiFileSchema = z.looseObject({
42
+ kind: z.literal('grpc'),
43
+ id: nonEmpty,
44
+ name: z.string(),
45
+ order: z.number().int(),
46
+ description: z.string().optional(),
47
+ target: z.string(),
48
+ tls: z.boolean().default(false),
49
+ metadata: z.array(keyValueEntrySchema).default([]),
50
+ auth: authConfigSchema.optional(),
51
+ definition: z
52
+ .looseObject({
53
+ // Absent in every project written before server reflection, which is an imported set.
54
+ kind: z.enum(['proto', 'reflection']).default('proto'),
55
+ source: nonEmpty,
56
+ cache: z.boolean().default(true),
57
+ roots: z.array(nonEmpty).default([]),
58
+ reflectionVersion: z.enum(['auto', 'v1', 'v1alpha']).optional(),
59
+ trustInvalid: z.boolean().optional(),
60
+ })
61
+ .optional(),
62
+ });
@@ -13,8 +13,10 @@
13
13
  * entity survives a rename, `slug` is the file-system name derived from `name`, and nothing here
14
14
  * ever holds a secret — credentials are `secretRef`s resolved from the OS keychain at send time.
15
15
  */
16
+ import type { Assertion } from '../assert/model.js';
17
+ import type { RequestScripts } from '../script/model.js';
16
18
  import type { AuthConfig, CreateOptions, IdGenerator } from '../project/model.js';
17
- import type { KeyValueEntry } from '../rest/model.js';
19
+ import type { KeyValueEntry } from '../http/entries.js';
18
20
  import type { GrpcMethodKind, GrpcReflectionVersion } from './shape.js';
19
21
  export { clientStreams, defaultTlsFor, GRPC_REFLECTION_VERSIONS, grpcMethodPath, serverStreams } from './shape.js';
20
22
  export type { GrpcMethodKind, GrpcReflectionVersion } from './shape.js';
@@ -66,6 +68,14 @@ export interface GrpcRequestDef {
66
68
  * is deleted on a re-import; the request survives badged, as a SOAP request does.
67
69
  */
68
70
  readonly orphaned?: boolean;
71
+ /**
72
+ * What `wirebench run` checks on the unary call's answer: the gRPC status code, the decoded
73
+ * response message as JSON, the duration. Optional so every place that builds a request without
74
+ * thinking about runs keeps compiling; absent reads as none.
75
+ */
76
+ readonly assertions?: readonly Assertion[];
77
+ /** Pre-request and post-response scripts, in files beside the request (#63). */
78
+ readonly scripts?: RequestScripts;
69
79
  }
70
80
  /** A named node in a gRPC API's tree. An import makes one per service. */
71
81
  export interface GrpcFolder {
@@ -0,0 +1,2 @@
1
+ /** The gRPC protocol: APIs, their folders and their unary and streaming requests. */
2
+ export declare const grpcProtocol: import("../protocol/module.js").ProtocolModule;
@@ -0,0 +1,13 @@
1
+ /** gRPC as a protocol module (spec §3). */
2
+ import { defineProtocol } from '../protocol/module.js';
3
+ import { grpcRun } from './run.js';
4
+ import { grpcScripting } from './scripting.js';
5
+ import { grpcStorage } from './storage.js';
6
+ /** The gRPC protocol: APIs, their folders and their unary and streaming requests. */
7
+ export const grpcProtocol = defineProtocol({
8
+ kind: 'grpc',
9
+ feature: { id: 'grpc', title: 'gRPC', default: true, stage: 'stable', requires: [] },
10
+ storage: grpcStorage,
11
+ run: grpcRun,
12
+ scripting: grpcScripting,
13
+ });
@@ -0,0 +1,73 @@
1
+ /**
2
+ * gRPC's run facet (spec §3.3). A run selects every method kind: a client or bidi stream sends its
3
+ * saved messages in order, then half-closes, and the run timeout bounds every stream (spec §5.2). A
4
+ * host drives a client or bidi stream's request side when it opens one interactive. A send resolves
5
+ * the call and refuses one
6
+ * it cannot make, loads the API's schema (without a schema there is no call, so no token is worth
7
+ * fetching; a schema that does not load is remembered for the run), runs its pre-request script,
8
+ * connects, then calls (spec §3.4).
9
+ */
10
+ import type { AssertionSubject } from '../assert/model.js';
11
+ import type { AuthConfig, Project } from '../project/model.js';
12
+ import type { ProtocolRun } from '../protocol/module.js';
13
+ import type { RunContext } from '../run/context.js';
14
+ import type { Resolved } from '../run/send-helpers.js';
15
+ import type { GrpcCallResult } from './call.js';
16
+ import type { GrpcApi, GrpcFolder, GrpcRequestDef } from './model.js';
17
+ import type { GrpcSendInput } from './send.js';
18
+ /** One saved gRPC request selected for a run. */
19
+ export interface GrpcSelected {
20
+ readonly kind: 'grpc';
21
+ readonly path: string;
22
+ readonly group: string;
23
+ readonly api: GrpcApi;
24
+ readonly chain: readonly GrpcFolder[];
25
+ readonly request: GrpcRequestDef;
26
+ }
27
+ /**
28
+ * What a failed call reports as its `SendFailure.input`: the call as far as it got, and its message
29
+ * text once resolved. It holds live credentials once connected; a host never logs it.
30
+ */
31
+ export type GrpcFailedInput = GrpcResolvedInput & {
32
+ readonly messageText?: string;
33
+ };
34
+ /** A call ready for `callGrpc`, which also takes the API's proto set and the message text. */
35
+ export type GrpcResolvedInput = Omit<GrpcSendInput, 'messages' | 'onMessage' | 'onOpen'>;
36
+ /** The same chain for a gRPC request: request, its folders inside-out, the API. */
37
+ export declare function grpcEffectiveAuth(selected: GrpcSelected): AuthConfig;
38
+ /**
39
+ * The gRPC item for `requestId`, built as a run builds it — and found even when its contract no
40
+ * longer has it (`orphaned`), which a run skips and a person may still send. Undefined when no gRPC
41
+ * request has that id.
42
+ */
43
+ export declare function grpcItemFor(project: Project, requestId: string): GrpcSelected | undefined;
44
+ /**
45
+ * The app's `resolveGrpcSend` plus what its send handler adds (spec §3.4): the target through the
46
+ * environment's override for the API (the slot a REST base URL uses), the settings ladder, and one
47
+ * expansion pass over target, metadata and message, nothing connected. A reference nothing
48
+ * resolves is reported in `unresolved`, not thrown, and so is a call with no method chosen: the
49
+ * send refuses both (`refuseUnsendable`), a preview shows them.
50
+ *
51
+ * @throws WirebenchError `secret-missing`
52
+ */
53
+ export declare function resolveGrpc(selected: GrpcSelected, context: RunContext): Promise<Resolved<GrpcResolvedInput> & {
54
+ readonly messageText: string;
55
+ }>;
56
+ /**
57
+ * The request's own TLS identity and trust decision and the chain's credentials (an OAuth2 token
58
+ * included), over a resolved call: what a send does after its pre-request script, so the script
59
+ * never sees a credential (spec §7). There is no proxy: the app sends gRPC direct as well.
60
+ *
61
+ * @throws WirebenchError `secret-missing` | `auth-grant-unsupported` | `keystore-missing`
62
+ */
63
+ export declare function connectGrpc(selected: GrpcSelected, context: RunContext, input: GrpcResolvedInput): Promise<GrpcResolvedInput>;
64
+ /**
65
+ * A call's answer as assertions see it: the gRPC status code (0 = OK), and its response as JSON. A
66
+ * unary or client-streaming call has one message: none, or one that did not decode, leaves nothing a
67
+ * `match` can read. A server-streaming or bidi call has every message, in order, as a JSON array,
68
+ * one that did not decode as `null` so the others keep their index.
69
+ * Exported for its unit test; not part of the run module's public surface.
70
+ */
71
+ export declare function grpcSubject(result: GrpcCallResult): AssertionSubject;
72
+ /** gRPC's run facet. */
73
+ export declare const grpcRun: ProtocolRun<GrpcSelected>;
@@ -0,0 +1,407 @@
1
+ import { GrpcError, HttpError, isWirebenchError, WirebenchError } from '../errors.js';
2
+ import { apiDefinitionDir } from '../project/paths.js';
3
+ import { resolveAuthChain } from '../http/auth/apply-auth.js';
4
+ import { scopesFor } from '../run/context.js';
5
+ import { exchangeController } from '../run/exchange.js';
6
+ import { authFor, baseUrlFor, dropRefusedToken, keystoreNeeds, tlsFor, unresolvedError, withSecrets, } from '../run/send-helpers.js';
7
+ import { ORPHANED_STEP_REASON, findInTree, walkTree } from '../run/tree.js';
8
+ import { applyGrpcSnapshot, grpcRequestSnapshot, grpcResponseSnapshot } from './scripting.js';
9
+ import { grpcMessageTypes, grpcScriptTypes } from './script-types.js';
10
+ import { secretNeedsOfAuth } from '../secrets/env-names.js';
11
+ import { toGrpcSendInput } from './send-input.js';
12
+ import { readGrpcDefinitionCache } from './cache.js';
13
+ import { callGrpc } from './call.js';
14
+ import { expandGrpcInput } from './expand.js';
15
+ import { clientStreams, grpcMethodPath } from './model.js';
16
+ import { loadProtoSet } from './proto/load.js';
17
+ import { protoSetFromDescriptorSet } from './reflection/descriptors.js';
18
+ import { grpcStatusNames } from './status.js';
19
+ /** The same chain for a gRPC request: request, its folders inside-out, the API. */
20
+ export function grpcEffectiveAuth(selected) {
21
+ const { api, chain, request } = selected;
22
+ return resolveAuthChain([request.auth, ...[...chain].reverse().map((folder) => folder.auth), api.auth]);
23
+ }
24
+ /**
25
+ * The gRPC item for `requestId`, built as a run builds it — and found even when its contract no
26
+ * longer has it (`orphaned`), which a run skips and a person may still send. Undefined when no gRPC
27
+ * request has that id.
28
+ */
29
+ export function grpcItemFor(project, requestId) {
30
+ const candidates = [];
31
+ for (const api of project.grpcApis) {
32
+ walkTree(api, [], api.name, `apis/${api.slug}/requests`, (request, chain, group) => request.id === requestId
33
+ ? { kind: 'grpc', path: `${group}/${request.name}`, group, api, chain, request }
34
+ : undefined, candidates);
35
+ }
36
+ return candidates[0]?.item;
37
+ }
38
+ /**
39
+ * The app's `resolveGrpcSend` plus what its send handler adds (spec §3.4): the target through the
40
+ * environment's override for the API (the slot a REST base URL uses), the settings ladder, and one
41
+ * expansion pass over target, metadata and message, nothing connected. A reference nothing
42
+ * resolves is reported in `unresolved`, not thrown, and so is a call with no method chosen: the
43
+ * send refuses both (`refuseUnsendable`), a preview shows them.
44
+ *
45
+ * @throws WirebenchError `secret-missing`
46
+ */
47
+ export async function resolveGrpc(selected, context) {
48
+ const { api, request } = selected;
49
+ const scopes = scopesFor(context);
50
+ const target = baseUrlFor(context, { slug: api.slug, baseUrl: api.target });
51
+ const unexpanded = toGrpcSendInput({
52
+ request: {
53
+ service: request.service,
54
+ method: request.method,
55
+ methodKind: request.methodKind,
56
+ metadata: request.metadata,
57
+ settings: request.settings,
58
+ },
59
+ target,
60
+ tls: api.tls,
61
+ apiMetadata: api.metadata,
62
+ // The user agent, socket timeout and TLS floor the app's own sends take from preferences.
63
+ ...(context.host.preferences !== undefined ? { preferences: context.host.preferences } : {}),
64
+ projectSettings: context.project.settings,
65
+ ...(context.signal !== undefined ? { signal: context.signal } : {}),
66
+ });
67
+ const withMessage = { ...unexpanded, messageText: request.message };
68
+ const withTokens = await withSecrets(withMessage, scopes, context.host.getSecret, context.secretPlaceholders);
69
+ const { input, unresolved } = expandGrpcInput(withMessage, withTokens, {
70
+ escape: request.settings.escapeProperties === true,
71
+ });
72
+ const { messageText, ...transport } = input;
73
+ return {
74
+ input: { ...transport, ...(context.timeoutMs !== undefined ? { timeoutMs: context.timeoutMs } : {}) },
75
+ messageText,
76
+ unresolved,
77
+ };
78
+ }
79
+ /**
80
+ * Refuses a resolved call the send cannot make, in the app's order: a reference nothing resolves,
81
+ * then no service or method chosen. Both come before the schema is loaded.
82
+ *
83
+ * @throws WirebenchError `grpc-unresolved-properties` | `grpc-method-unset`
84
+ */
85
+ function refuseUnsendable(selected, resolved) {
86
+ if (resolved.unresolved.length > 0) {
87
+ throw unresolvedError('grpc-unresolved-properties', selected.path, resolved.unresolved);
88
+ }
89
+ if (selected.request.service === '' || selected.request.method === '') {
90
+ throw new WirebenchError('grpc-method-unset', 'Choose the service and method this request calls first.', {
91
+ details: { path: selected.path },
92
+ });
93
+ }
94
+ }
95
+ /**
96
+ * The request's own TLS identity and trust decision and the chain's credentials (an OAuth2 token
97
+ * included), over a resolved call: what a send does after its pre-request script, so the script
98
+ * never sees a credential (spec §7). There is no proxy: the app sends gRPC direct as well.
99
+ *
100
+ * @throws WirebenchError `secret-missing` | `auth-grant-unsupported` | `keystore-missing`
101
+ */
102
+ export async function connectGrpc(selected, context, input) {
103
+ const { request } = selected;
104
+ const tls = await tlsFor(context, request.settings.sslKeystoreRef, request.settings.trustInvalid === true);
105
+ const auth = await authFor(grpcEffectiveAuth(selected), selected.path, context, tls);
106
+ return {
107
+ ...input,
108
+ ...(auth !== undefined ? { auth } : {}),
109
+ ...(tls !== undefined ? { tlsOptions: { ...input.tlsOptions, ...tls } } : {}),
110
+ };
111
+ }
112
+ /**
113
+ * Reads a gRPC API's schema from `apis/<slug>/definition/`, as the app's `grpcProtoSetFor` does:
114
+ * the `.proto` sources an import cached, or the descriptor set reflection cached. A run never
115
+ * reflects against a server, so an API with no cache has no schema and none of its calls can run.
116
+ *
117
+ * @throws WirebenchError `grpc-definition-missing` when there is no cache; whatever the loaders
118
+ * throw for one that does not load
119
+ */
120
+ async function loadProtoSetFor(projectDir, api) {
121
+ let cache;
122
+ try {
123
+ cache = await readGrpcDefinitionCache(apiDefinitionDir(projectDir, api.slug));
124
+ }
125
+ catch (error) {
126
+ if (isWirebenchError(error) && error.code === 'definition-cache-missing') {
127
+ throw new WirebenchError('grpc-definition-missing', `The gRPC API "${api.name}" has no cached definition; import its .proto files or discover it in the app first.`, { details: { api: api.name }, cause: error });
128
+ }
129
+ throw error;
130
+ }
131
+ return cache.kind === 'proto'
132
+ ? loadProtoSet(cache.sources, { roots: cache.manifest.roots })
133
+ : protoSetFromDescriptorSet(cache.descriptors, { roots: cache.manifest.roots });
134
+ }
135
+ /**
136
+ * A call's answer as assertions see it: the gRPC status code (0 = OK), and its response as JSON. A
137
+ * unary or client-streaming call has one message: none, or one that did not decode, leaves nothing a
138
+ * `match` can read. A server-streaming or bidi call has every message, in order, as a JSON array,
139
+ * one that did not decode as `null` so the others keep their index.
140
+ * Exported for its unit test; not part of the run module's public surface.
141
+ */
142
+ export function grpcSubject(result) {
143
+ const first = result.responseMessages[0];
144
+ const streamed = result.methodKind === 'server-streaming' || result.methodKind === 'bidi-streaming';
145
+ const decoded = streamed || (first !== undefined && first.json !== undefined);
146
+ const body = streamed ? result.responseMessages.map((message) => message.json ?? null) : first?.json;
147
+ return {
148
+ protocol: 'grpc',
149
+ status: result.exchange.status,
150
+ durationMs: result.exchange.durationMs,
151
+ bodyText: decoded ? JSON.stringify(body) : '',
152
+ bodyKind: decoded ? 'json' : 'other',
153
+ // Metadata first, then trailers: a header assertion or transfer takes the first value it finds.
154
+ headers: [...Object.entries(result.exchange.headers), ...Object.entries(result.exchange.trailers)],
155
+ statusNames: grpcStatusNames,
156
+ };
157
+ }
158
+ /** gRPC's `UNAUTHENTICATED`: the server's word for a credential it will not accept. */
159
+ const GRPC_UNAUTHENTICATED = 16;
160
+ /** gRPC's `DEADLINE_EXCEEDED`. */
161
+ const GRPC_DEADLINE_EXCEEDED = 4;
162
+ /**
163
+ * True when the deadline cut a stream a run made: the local deadline ended it, or the server said so
164
+ * once the deadline had passed. A unary call keeps `DEADLINE_EXCEEDED` as its status, for assertions.
165
+ */
166
+ function deadlineCut(result, timeoutMs) {
167
+ const { exchange } = result;
168
+ return (result.methodKind !== 'unary' &&
169
+ exchange.status === GRPC_DEADLINE_EXCEEDED &&
170
+ // A server's own status 4 counts once the deadline has passed: the local one would have fired by then.
171
+ (exchange.statusSource === 'local' || exchange.durationMs >= timeoutMs));
172
+ }
173
+ /**
174
+ * The API's schema: the host's when it lends one, otherwise read from the definition cache once per
175
+ * run, a failed load remembered.
176
+ */
177
+ async function protoSetFor(selected, scope, context) {
178
+ const lent = context.host.protoSetFor;
179
+ if (lent !== undefined)
180
+ return (await lent(selected));
181
+ const { api } = selected;
182
+ return scope.memo(`grpc:${api.id}:proto-set`, () => loadProtoSetFor(scope.context.projectDir, api));
183
+ }
184
+ /**
185
+ * What a failed call was about to put on the wire: an HTTP/2 POST to `/<service>/<method>`, its
186
+ * metadata. A call with no method chosen names its target alone.
187
+ */
188
+ function attemptedOf(input) {
189
+ const path = input.service === '' || input.method === '' ? '' : grpcMethodPath(input.service, input.method);
190
+ return {
191
+ url: `${input.tls ? 'https' : 'http'}://${input.target}${path}`,
192
+ method: 'POST',
193
+ headers: Object.fromEntries(input.metadata.filter((row) => row.enabled).map((row) => [row.name, row.value])),
194
+ };
195
+ }
196
+ function streamClosed(halfClosed, settled) {
197
+ return new GrpcError('grpc-stream-closed', 'The request side of this call is already closed', {
198
+ details: { halfClosed, settled },
199
+ });
200
+ }
201
+ function grpcStreamState(controller) {
202
+ let side;
203
+ let waiting = [];
204
+ let ended = false;
205
+ /** The call has ended; when it never opened, nothing pushed now could be written. */
206
+ let done = false;
207
+ // Async only to turn a throw into a rejection: the body, and so the write, runs at once.
208
+ // eslint-disable-next-line @typescript-eslint/require-await
209
+ const write = async (handle, text) => handle.send(text);
210
+ const end = (handle) => {
211
+ handle.end();
212
+ controller.queue.push({ protocol: 'grpc', kind: 'closed' });
213
+ };
214
+ // `close` is a half-close too: a gRPC call is aborted by `cancel`, never by its request side.
215
+ const halfClose = () => {
216
+ if (ended)
217
+ return;
218
+ ended = true;
219
+ // Before the call opens, the opening ends it once the pushes made before now are written.
220
+ if (side !== undefined)
221
+ end(side);
222
+ };
223
+ return {
224
+ streaming: {
225
+ push: (message) => {
226
+ if (!('text' in message)) {
227
+ return Promise.reject(new WirebenchError('exchange-not-streaming', 'A gRPC call takes its messages as JSON text, not binary', {
228
+ details: { protocol: 'grpc', reason: 'binary' },
229
+ }));
230
+ }
231
+ if (ended)
232
+ return Promise.reject(streamClosed(true, false));
233
+ if (side !== undefined)
234
+ return write(side, message.text);
235
+ if (done)
236
+ return Promise.reject(streamClosed(false, true));
237
+ return new Promise((resolve, reject) => waiting.push({ text: message.text, resolve, reject }));
238
+ },
239
+ halfClose,
240
+ close: halfClose,
241
+ },
242
+ opened(handle) {
243
+ side = handle;
244
+ controller.queue.push({ protocol: 'grpc', kind: 'open' });
245
+ const queued = waiting;
246
+ waiting = [];
247
+ for (const push of queued)
248
+ write(handle, push.text).then(push.resolve, push.reject);
249
+ if (ended)
250
+ end(handle);
251
+ },
252
+ settled() {
253
+ done = true;
254
+ const queued = waiting;
255
+ waiting = [];
256
+ for (const push of queued)
257
+ push.reject(streamClosed(ended, true));
258
+ },
259
+ };
260
+ }
261
+ /**
262
+ * One gRPC request as a run or a host sends it (spec §3.4): resolve, run its pre-request script when
263
+ * `scripts` is given, connect, call, then its post-response script. A failure is told to the host
264
+ * with its stage and what was attempted: a reference nothing resolves in the prepare stage.
265
+ */
266
+ async function sendGrpcItem(selected, scope, context, scripts, mode) {
267
+ const { controller, live, run, stream } = mode;
268
+ let startedAt = Date.now();
269
+ // Never masks the send's own error: a row that cannot be built, or a host that throws, is dropped.
270
+ const failed = (stage, error, attempted, messageText) => {
271
+ try {
272
+ const input = attempted === undefined ? undefined : { ...attempted, ...(messageText !== undefined ? { messageText } : {}) };
273
+ context.host.events?.onFailed?.(selected, {
274
+ stage,
275
+ error,
276
+ startedAt,
277
+ durationMs: Date.now() - startedAt,
278
+ ...(attempted !== undefined ? { attempted: attemptedOf(attempted), input } : {}),
279
+ });
280
+ }
281
+ catch {
282
+ // Deliberately ignored — see above.
283
+ }
284
+ };
285
+ try {
286
+ let input;
287
+ let connected;
288
+ let messageText;
289
+ let protoSet;
290
+ let sent;
291
+ try {
292
+ const resolved = await resolveGrpc(selected, scripts !== undefined ? { ...context, secretPlaceholders: scripts.placeholders } : context);
293
+ input = resolved.input;
294
+ messageText = resolved.messageText;
295
+ refuseUnsendable(selected, resolved);
296
+ // Before the send connects: without a schema there is no call, so no token is worth fetching.
297
+ protoSet = await protoSetFor(selected, scope, context);
298
+ if (scripts === undefined) {
299
+ connected = await connectGrpc(selected, context, resolved.input);
300
+ }
301
+ else {
302
+ const before = grpcRequestSnapshot(resolved.input, resolved.messageText);
303
+ sent = await scripts.session.pre(before);
304
+ const changed = applyGrpcSnapshot(resolved.input, resolved.messageText, before, sent);
305
+ const restored = await scripts.placeholders.restore({ metadata: changed.input.metadata, messageText: changed.messageText }, context.host.getSecret);
306
+ input = { ...changed.input, metadata: restored.metadata };
307
+ messageText = restored.messageText;
308
+ connected = await connectGrpc(selected, context, input);
309
+ }
310
+ }
311
+ catch (error) {
312
+ failed('prepare', error, input, messageText);
313
+ throw error;
314
+ }
315
+ const sentText = messageText;
316
+ // The send stage's own clock: a send-stage failure never counts resolve, the script or the token.
317
+ startedAt = Date.now();
318
+ let result;
319
+ try {
320
+ result = await callGrpc({
321
+ ...connected,
322
+ set: protoSet,
323
+ messageText: sentText,
324
+ signal: controller.signal,
325
+ // Only a live send decodes each message as it arrives; any other has them all in the result.
326
+ ...(live
327
+ ? {
328
+ onHeaders: (headers, httpStatus) => controller.queue.push({ protocol: 'grpc', kind: 'headers', httpStatus, headers }),
329
+ onMessage: (message, index) => controller.queue.push({ protocol: 'grpc', kind: 'message', index, message }),
330
+ }
331
+ : {}),
332
+ ...(stream !== undefined ? { onOpen: (handle) => stream.opened(handle) } : {}),
333
+ });
334
+ if (run && deadlineCut(result, connected.timeoutMs)) {
335
+ throw new HttpError('timeout', 'The request timed out.', { details: { target: connected.target } });
336
+ }
337
+ }
338
+ catch (error) {
339
+ failed('send', error, connected, sentText);
340
+ throw error;
341
+ }
342
+ dropRefusedToken(context, connected.auth, result.exchange.status === GRPC_UNAUTHENTICATED);
343
+ return {
344
+ subject: grpcSubject(result),
345
+ raw: result.exchange,
346
+ exchange: { kind: 'grpc', grpc: result, input: connected, messageText: sentText },
347
+ origin: connected.target,
348
+ ...(scripts !== undefined
349
+ ? { script: await scripts.session.post(sent, grpcResponseSnapshot(result)) }
350
+ : {}),
351
+ };
352
+ }
353
+ finally {
354
+ stream?.settled();
355
+ }
356
+ }
357
+ /** gRPC's run facet. */
358
+ export const grpcRun = {
359
+ groups(project) {
360
+ return project.grpcApis.map((api) => {
361
+ const candidates = [];
362
+ walkTree(api, [], api.name, `apis/${api.slug}/requests`, (request, chain, group) => request.orphaned === true
363
+ ? undefined
364
+ : { kind: 'grpc', path: `${group}/${request.name}`, group, api, chain, request }, candidates);
365
+ return { order: api.order, name: api.name, candidates };
366
+ });
367
+ },
368
+ whyNotRunnable(project, requestId) {
369
+ for (const api of project.grpcApis) {
370
+ const request = findInTree(api, requestId);
371
+ if (request !== undefined) {
372
+ return request.orphaned === true ? ORPHANED_STEP_REASON : undefined;
373
+ }
374
+ }
375
+ return undefined;
376
+ },
377
+ open(selected, scope, host, options) {
378
+ const controller = exchangeController('grpc', options);
379
+ const context = { ...scope.context, host, signal: controller.signal };
380
+ // Only a client or bidi stream has a request side to drive; any other call refuses a push.
381
+ const stream = options.interactive && clientStreams(selected.request.methodKind) ? grpcStreamState(controller) : undefined;
382
+ const mode = {
383
+ controller,
384
+ live: options.live === true,
385
+ run: options.run === true,
386
+ ...(stream !== undefined ? { stream } : {}),
387
+ };
388
+ return controller.handle(() => sendGrpcItem(selected, scope, context, options.scripts, mode), stream?.streaming);
389
+ },
390
+ resolve(selected, scope, host) {
391
+ return resolveGrpc(selected, { ...scope.context, host });
392
+ },
393
+ async scriptTypes(selected, scope) {
394
+ // A schema that does not load leaves the messages untyped; the send reports the missing schema.
395
+ const protoSet = await protoSetFor(selected, scope, scope.context).catch(() => undefined);
396
+ const types = grpcMessageTypes(protoSet, selected.request.service, selected.request.method);
397
+ return {
398
+ generated: grpcScriptTypes(types === undefined ? undefined : protoSet, types?.input ?? '', types?.output ?? ''),
399
+ };
400
+ },
401
+ secretNeeds(selected, project) {
402
+ return [
403
+ ...secretNeedsOfAuth(grpcEffectiveAuth(selected)),
404
+ ...keystoreNeeds(project, selected.request.settings.sslKeystoreRef),
405
+ ];
406
+ },
407
+ };
@@ -0,0 +1,8 @@
1
+ import type { ProtoSet } from './proto/load.js';
2
+ /** `WbRequestMessage` and `WbResponseMessage` for a method's input and output types. */
3
+ export declare function grpcScriptTypes(set: ProtoSet | undefined, inputType: string, outputType: string): string;
4
+ /** A gRPC method's request and response message types, when the set has the method. */
5
+ export declare function grpcMessageTypes(set: ProtoSet | undefined, service: string, method: string): {
6
+ readonly input: string;
7
+ readonly output: string;
8
+ } | undefined;