@wirebench/engine 2.2.1 → 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
@@ -1,8 +1,10 @@
1
1
  /**
2
- * One WebSocket connection from handshake to close, and the only file that touches undici's
3
- * WebSocket. It knows nothing about projects or containers: a saved WebSocket request opens one
4
- * through `call.ts`, and anything else that needs a socket — a subscription protocol layered on a
5
- * subprotocol, a contract check wrapped around `onFrame` — opens one the same way.
2
+ * One WebSocket connection from handshake to close, recorded frame by frame. It is one of the two
3
+ * files that touch undici's WebSocket: the other, `connect.ts`, hands a bare socket to a caller with
4
+ * its own protocol, and both build their dispatcher with `wsDispatcher`. It knows nothing about
5
+ * projects or containers: a saved WebSocket request opens one through `call.ts`, and anything else
6
+ * that needs a recorded socket (a subscription protocol layered on a subprotocol, a contract check
7
+ * wrapped around `onFrame`) opens one the same way.
6
8
  *
7
9
  * Whatever the server does is a result. `done` never rejects: a refused handshake, a dropped
8
10
  * socket and a clean close all resolve with the exchange that records them. A bad *option* is
@@ -10,13 +12,23 @@
10
12
  * whatever it had already built (subscriptions, an owned dispatcher) before doing so.
11
13
  */
12
14
  import diagnosticsChannel from 'node:diagnostics_channel';
13
- import { ProxyAgent, WebSocket } from 'undici';
15
+ import { WebSocket } from 'undici';
14
16
  import { WsError } from '../errors.js';
15
- import { createDispatcher, proxyAgentOptionsFor } from '../http/client.js';
16
17
  import { sslInfoForSocket } from '../http/tls.js';
18
+ import { wsDispatcher } from './connect.js';
17
19
  const DEFAULT_HANDSHAKE_TIMEOUT_MS = 30_000;
18
- /** RFC 6455 §7.4, as the WHATWG API enforces it: 1000, or the 3000–4999 range. */
19
- function assertCloseCode(code) {
20
+ /**
21
+ * How a handshake that timed out begins its `error`: the one failure a caller tells apart from a
22
+ * refusal (the run facet fails a run's send with `timeout` for it). Not part of the public surface.
23
+ */
24
+ export const HANDSHAKE_TIMEOUT_ERROR = 'The server did not answer the handshake within';
25
+ /**
26
+ * RFC 6455 §7.4, as the WHATWG API enforces it: 1000, or the 3000–4999 range. Exported for the run
27
+ * facet, which refuses a bad code when it is asked to close rather than when the close goes out.
28
+ *
29
+ * @throws WsError `ws-bad-close`
30
+ */
31
+ export function assertCloseCode(code) {
20
32
  if (code !== 1000 && !(code >= 3000 && code <= 4999)) {
21
33
  throw new WsError('ws-bad-close', `${code} is not a close code an application may send (1000, or 3000–4999)`, {
22
34
  details: { code },
@@ -76,12 +88,9 @@ export function openWsSession(options, hooks = {}) {
76
88
  details: { url: options.url },
77
89
  });
78
90
  }
79
- // `createDispatcher({ proxy })` does not CONNECT-tunnel a WebSocket handshake: undici rewrites
80
- // `ws:`/`wss:` to `http:`/`https:` before dispatching, and `ProxyAgent` only tunnels `http:`
81
- // when built with `proxyTunnel: true`. So a proxied session always owns its own `ProxyAgent`;
82
- // an unproxied one owns a dispatcher only when it asked for TLS/bind-address options that
83
- // `createDispatcher` would otherwise hand back the shared keep-alive agent for.
84
- const ownsDispatcher = options.proxy !== undefined || options.tls !== undefined || options.localAddress !== undefined;
91
+ // Which dispatcher the handshake gets, and whether this session must close it, is `wsDispatcher`'s
92
+ // rule (`connect.ts`). It is assigned in the try block that builds the socket, below.
93
+ let ownsDispatcher = false;
85
94
  const httpOrigin = `${target.protocol === 'wss:' ? 'https:' : 'http:'}//${target.host}`;
86
95
  const frames = [];
87
96
  const counts = { sent: 0, received: 0, bytesSent: 0, bytesReceived: 0 };
@@ -91,6 +100,9 @@ export function openWsSession(options, hooks = {}) {
91
100
  let closedBy;
92
101
  let failure;
93
102
  let settled = false;
103
+ /** The upgrade's socket, which a close the server never answers tears down after `closeGraceMs`. */
104
+ let connection;
105
+ let closeTimer;
94
106
  const record = (direction, opcode, payload, close) => {
95
107
  const bytes = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : Buffer.from(payload);
96
108
  const binaryish = opcode === 'binary' || ((opcode === 'ping' || opcode === 'pong') && bytes.length > 0);
@@ -139,6 +151,7 @@ export function openWsSession(options, hooks = {}) {
139
151
  if (!isUpgradeHeadFor(message, httpOrigin, `${target.pathname}${target.search}`))
140
152
  return;
141
153
  rawRequestHead = message.headers;
154
+ connection = message.socket;
142
155
  if (message.socket?.encrypted === true)
143
156
  tls = sslInfoForSocket(message.socket);
144
157
  };
@@ -190,16 +203,7 @@ export function openWsSession(options, hooks = {}) {
190
203
  // owned dispatcher if one got built, then report `ws-bad-options` instead of leaking either.
191
204
  let dispatcher;
192
205
  try {
193
- dispatcher =
194
- options.proxy !== undefined
195
- ? new ProxyAgent(proxyAgentOptionsFor(options.proxy, {
196
- ...(options.tls !== undefined ? { tls: options.tls } : {}),
197
- ...(options.localAddress !== undefined ? { localAddress: options.localAddress } : {}),
198
- }, false, { proxyTunnel: true }))
199
- : createDispatcher({
200
- ...(options.tls !== undefined ? { tls: options.tls } : {}),
201
- ...(options.localAddress !== undefined ? { localAddress: options.localAddress } : {}),
202
- });
206
+ ({ dispatcher, owned: ownsDispatcher } = wsDispatcher(options));
203
207
  diagnosticsChannel.subscribe('undici:client:sendHeaders', onSendHeaders);
204
208
  diagnosticsChannel.subscribe('undici:websocket:open', onOpenChannel);
205
209
  diagnosticsChannel.subscribe('undici:websocket:ping', onPing);
@@ -236,6 +240,7 @@ export function openWsSession(options, hooks = {}) {
236
240
  return;
237
241
  settled = true;
238
242
  clearTimeout(timer);
243
+ clearTimeout(closeTimer);
239
244
  options.signal?.removeEventListener('abort', onAbort);
240
245
  unsubscribeAll();
241
246
  const clean = wasClean && handshake !== undefined;
@@ -262,16 +267,37 @@ export function openWsSession(options, hooks = {}) {
262
267
  hooks.onClosed?.(exchange);
263
268
  resolveDone(exchange);
264
269
  };
270
+ /**
271
+ * Lets go of a connection whose close the server never answered: the socket is destroyed, and the
272
+ * session settles with 1006 on the next macrotask if undici reports nothing of it.
273
+ */
274
+ const tearDown = () => {
275
+ if (settled)
276
+ return;
277
+ connection?.destroy?.();
278
+ setTimeout(() => settle(1006, '', false), 0);
279
+ };
280
+ /** Gives a close from this side `closeGraceMs` to be answered, when the options bound it. */
281
+ const boundClose = () => {
282
+ if (options.closeGraceMs === undefined || closeTimer !== undefined)
283
+ return;
284
+ closeTimer = setTimeout(tearDown, options.closeGraceMs);
285
+ };
265
286
  /** Ends a session the server never ended: a timeout, or an abort. */
266
287
  const fail = (message) => {
267
288
  failure ??= message;
268
289
  closedBy ??= 'error';
290
+ // A cancel while the close waits for its answer, when the wait is bounded, waits no more.
291
+ if (ws.readyState === WebSocket.CLOSING && options.closeGraceMs !== undefined) {
292
+ tearDown();
293
+ return;
294
+ }
269
295
  // There is no abort for a connecting socket; close() on one fails the handshake, which is the point.
270
296
  ws.close();
271
297
  };
272
298
  const timer = setTimeout(() => {
273
299
  if (handshake === undefined)
274
- fail(`The server did not answer the handshake within ${timeoutMs} ms`);
300
+ fail(`${HANDSHAKE_TIMEOUT_ERROR} ${timeoutMs} ms`);
275
301
  }, timeoutMs);
276
302
  const onAbort = () => fail('The connection was cancelled');
277
303
  if (options.signal?.aborted === true)
@@ -328,6 +354,7 @@ export function openWsSession(options, hooks = {}) {
328
354
  if (ws.readyState === WebSocket.OPEN)
329
355
  record('sent', 'close', reason, { code, reason });
330
356
  ws.close(code, reason);
357
+ boundClose();
331
358
  },
332
359
  };
333
360
  }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * How WebSocket APIs are stored in a project folder (spec §3.2): `apis/<slug>/api.yaml` with
3
+ * `kind: websocket`, and a tree of folders and `*.request.yaml` files under `requests/`, each saved
4
+ * message in a sibling `<slug>.msg-<message slug>.<ext>`.
5
+ */
6
+ import type { ProtocolStorage } from '../protocol/module.js';
7
+ import type { WsApi } from './model.js';
8
+ /** WebSocket's storage facet. */
9
+ export declare const wsStorage: ProtocolStorage<WsApi>;
@@ -0,0 +1,176 @@
1
+ /**
2
+ * How WebSocket APIs are stored in a project folder (spec §3.2): `apis/<slug>/api.yaml` with
3
+ * `kind: websocket`, and a tree of folders and `*.request.yaml` files under `requests/`, each saved
4
+ * message in a sibling `<slug>.msg-<message slug>.<ext>`.
5
+ */
6
+ import { toCallbackAssertion } from '../assert/schema.js';
7
+ import { ProjectError } from '../errors.js';
8
+ import { readFileIfExists } from '../project/fs.js';
9
+ import { abs, authConfig, definitionAuth, exact, keyValueEntries, loadFolderContents, optional, readYaml, } from '../project/load-helpers.js';
10
+ import { apiManagedFiles } from '../project/managed-files.js';
11
+ import { API_FILE, APIS_DIR, assertPathSegment, REQUEST_SUFFIX, REQUESTS_DIR } from '../project/paths.js';
12
+ import { assertSupportedKind, parseFile } from '../project/schema-parts.js';
13
+ import { addFolderFiles, authDocument, definitionDocument, keyValueDocuments } from '../project/serialize-helpers.js';
14
+ import { compact, stringifyYaml } from '../project/yaml.js';
15
+ import { wsApiFileSchema, wsRequestFileSchema } from './files.js';
16
+ import { wsMessageFileName } from './model.js';
17
+ /**
18
+ * Reads a WebSocket request and its saved messages, each in its own sibling file. A message whose
19
+ * file is gone loads with empty content and a `missing-body` problem, exactly as a gRPC message
20
+ * does; its slug is recovered from the file name between the `.msg-` marker and the extension.
21
+ */
22
+ function wsRequestReader(fs, root, problems) {
23
+ return async (dir, fileName, unclaimed) => {
24
+ const relative = `${dir}/${fileName}`;
25
+ const document = await readYaml(fs, root, relative);
26
+ assertSupportedKind(document, relative);
27
+ const parsed = parseFile(wsRequestFileSchema, document, relative);
28
+ unclaimed.delete(fileName);
29
+ const requestSlug = fileName.slice(0, -REQUEST_SUFFIX.length);
30
+ const messages = [];
31
+ for (const entry of parsed.messages) {
32
+ assertPathSegment(entry.file);
33
+ unclaimed.delete(entry.file);
34
+ const messageRelative = `${dir}/${entry.file}`;
35
+ const text = await readFileIfExists(fs, abs(root, messageRelative));
36
+ if (text === undefined) {
37
+ problems.push({
38
+ code: 'missing-body',
39
+ message: `Request "${parsed.name}" has no message file; loaded with an empty message`,
40
+ file: messageRelative,
41
+ });
42
+ }
43
+ const slug = entry.file.slice(`${requestSlug}.msg-`.length, entry.file.lastIndexOf('.'));
44
+ messages.push({
45
+ id: entry.id,
46
+ name: entry.name,
47
+ slug,
48
+ format: entry.format,
49
+ content: text === undefined ? '' : text.toString('utf8'),
50
+ ...(entry.contract !== undefined
51
+ ? { contract: { message: entry.contract.message, generated: entry.contract.generated } }
52
+ : {}),
53
+ });
54
+ }
55
+ return {
56
+ kind: 'websocket',
57
+ id: parsed.id,
58
+ name: parsed.name,
59
+ slug: requestSlug,
60
+ order: parsed.order,
61
+ ...optional('description', parsed.description),
62
+ url: parsed.url,
63
+ query: keyValueEntries(parsed.query),
64
+ headers: keyValueEntries(parsed.headers),
65
+ subprotocols: parsed.subprotocols,
66
+ auth: authConfig(parsed.auth),
67
+ settings: exact(parsed.settings),
68
+ messages,
69
+ assertions: parsed.assertions.map((a) => (a.type === 'callback' ? toCallbackAssertion(a) : exact(a))),
70
+ ...(parsed.contract !== undefined ? { contract: { channel: parsed.contract.channel } } : {}),
71
+ ...(parsed.orphaned === true ? { orphaned: true } : {}),
72
+ };
73
+ };
74
+ }
75
+ /**
76
+ * A WebSocket request as written: each saved message goes to a sibling file, so a JSON message is a
77
+ * JSON file in git. Siblings rather than a directory, because every directory here loads as a folder.
78
+ *
79
+ * @throws ProjectError `duplicate-slug` when two of the request's messages share a slug.
80
+ */
81
+ const writeWsRequest = (files, dir, request) => {
82
+ const messages = request.messages.map((message) => {
83
+ const file = wsMessageFileName(request.slug, message);
84
+ assertPathSegment(file);
85
+ if (files.has(`${dir}/${file}`)) {
86
+ throw new ProjectError('duplicate-slug', `Request "${request.name}" has two messages named "${message.slug}"`, {
87
+ details: { file: `${dir}/${file}` },
88
+ });
89
+ }
90
+ files.set(`${dir}/${file}`, message.content);
91
+ return compact({
92
+ id: message.id,
93
+ name: message.name,
94
+ format: message.format === 'binary' ? 'binary' : undefined,
95
+ file,
96
+ contract: message.contract === undefined
97
+ ? undefined
98
+ : { message: message.contract.message, generated: message.contract.generated },
99
+ });
100
+ });
101
+ files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(compact({
102
+ kind: request.kind,
103
+ id: request.id,
104
+ name: request.name,
105
+ order: request.order,
106
+ description: request.description,
107
+ url: request.url,
108
+ query: request.query.length > 0 ? keyValueDocuments(request.query) : undefined,
109
+ headers: request.headers.length > 0 ? keyValueDocuments(request.headers) : undefined,
110
+ subprotocols: request.subprotocols.length > 0 ? [...request.subprotocols] : undefined,
111
+ auth: authDocument(request.auth),
112
+ settings: Object.keys(request.settings).length > 0 ? compact({ ...request.settings }) : undefined,
113
+ messages: messages.length > 0 ? messages : undefined,
114
+ assertions: request.assertions.length > 0 ? request.assertions.map((a) => compact({ ...a })) : undefined,
115
+ contract: request.contract === undefined ? undefined : { channel: request.contract.channel },
116
+ orphaned: request.orphaned === true ? true : undefined,
117
+ })));
118
+ };
119
+ /** Every file one WebSocket API occupies. It shares `apis/` with the others; its `kind` says which it is. */
120
+ function addWsApiFiles(files, api) {
121
+ assertPathSegment(api.slug);
122
+ const base = `${APIS_DIR}/${api.slug}`;
123
+ files.set(`${base}/${API_FILE}`, stringifyYaml(compact({
124
+ kind: api.kind,
125
+ id: api.id,
126
+ name: api.name,
127
+ order: api.order,
128
+ description: api.description,
129
+ url: api.url,
130
+ headers: api.headers.length > 0 ? keyValueDocuments(api.headers) : undefined,
131
+ auth: api.auth === undefined ? undefined : authDocument(api.auth),
132
+ definition: api.definition === undefined ? undefined : definitionDocument(api.definition),
133
+ })));
134
+ addFolderFiles(files, `${base}/${REQUESTS_DIR}`, api, 0, writeWsRequest);
135
+ }
136
+ /** WebSocket's storage facet. */
137
+ export const wsStorage = {
138
+ dir: APIS_DIR,
139
+ async load(ctx, slug, document) {
140
+ const { fs, root, problems } = ctx;
141
+ const parsed = parseFile(wsApiFileSchema, document, `${APIS_DIR}/${slug}/${API_FILE}`);
142
+ const contents = await loadFolderContents(fs, root, `${APIS_DIR}/${slug}/${REQUESTS_DIR}`, 0, problems, wsRequestReader(fs, root, problems));
143
+ return {
144
+ kind: 'websocket',
145
+ id: parsed.id,
146
+ name: parsed.name,
147
+ slug,
148
+ order: parsed.order,
149
+ ...optional('description', parsed.description),
150
+ url: parsed.url,
151
+ headers: keyValueEntries(parsed.headers),
152
+ ...(parsed.auth !== undefined ? { auth: authConfig(parsed.auth) } : {}),
153
+ ...(parsed.definition !== undefined
154
+ ? {
155
+ definition: {
156
+ kind: parsed.definition.kind,
157
+ source: parsed.definition.source,
158
+ cache: parsed.definition.cache,
159
+ ...optional('server', parsed.definition.server),
160
+ ...optional('auth', definitionAuth(parsed.definition.auth)),
161
+ },
162
+ }
163
+ : {}),
164
+ folders: contents.folders,
165
+ requests: contents.requests,
166
+ };
167
+ },
168
+ files(api) {
169
+ const files = new Map();
170
+ addWsApiFiles(files, api);
171
+ return files;
172
+ },
173
+ managed: (fs, root, slug) => apiManagedFiles(fs, root, slug),
174
+ containers: (project) => project.wsApis,
175
+ withContainers: (project, wsApis) => ({ ...project, wsApis }),
176
+ };
@@ -2,13 +2,12 @@
2
2
  * What History keeps of a session. Both ends, because the end — the last messages before an
3
3
  * unexpected close — is what a person comes back for, and a first-N cap loses exactly that.
4
4
  */
5
+ import { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL } from '../http/transcript-cap.js';
5
6
  import type { WsFrame } from './model.js';
6
- export declare const WS_HISTORY_HEAD = 400;
7
- export declare const WS_HISTORY_TAIL = 100;
8
- export declare const WS_HISTORY_MAX_BYTES = 1048576;
7
+ export { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL };
9
8
  export interface WsTranscript {
10
9
  readonly frames: readonly WsFrame[];
11
10
  readonly truncated: boolean;
12
11
  readonly omittedFrames: number;
13
12
  }
14
- export declare function capFrames(frames: readonly WsFrame[]): WsTranscript;
13
+ export declare function capFrames(input: readonly WsFrame[]): WsTranscript;
@@ -1,20 +1,28 @@
1
- export const WS_HISTORY_HEAD = 400;
2
- export const WS_HISTORY_TAIL = 100;
3
- export const WS_HISTORY_MAX_BYTES = 1_048_576;
4
- export function capFrames(frames) {
5
- const limit = WS_HISTORY_HEAD + WS_HISTORY_TAIL;
6
- const kept = frames.length <= limit ? [...frames] : [...frames.slice(0, WS_HISTORY_HEAD), ...frames.slice(-WS_HISTORY_TAIL)];
7
- const omittedFrames = frames.length - kept.length;
8
- let budget = WS_HISTORY_MAX_BYTES;
9
- let stripped = false;
10
- const capped = kept.map((frame) => {
11
- if (frame.size <= budget) {
12
- budget -= frame.size;
13
- return frame;
14
- }
1
+ /**
2
+ * What History keeps of a session. Both ends, because the end — the last messages before an
3
+ * unexpected close — is what a person comes back for, and a first-N cap loses exactly that.
4
+ */
5
+ import { capByEnds, WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL } from '../http/transcript-cap.js';
6
+ export { WS_HISTORY_HEAD, WS_HISTORY_MAX_BYTES, WS_HISTORY_TAIL };
7
+ /** History keeps a frame's contract verdict but not its problem list: the list is for the live
8
+ * view, and re-checking a saved frame recomputes it. */
9
+ function withoutProblems(frame) {
10
+ if (frame.contract?.problems === undefined)
11
+ return frame;
12
+ const { status, message, reason } = frame.contract;
13
+ const contract = {
14
+ status,
15
+ ...(message !== undefined ? { message } : {}),
16
+ ...(reason !== undefined ? { reason } : {}),
17
+ };
18
+ return { ...frame, contract };
19
+ }
20
+ export function capFrames(input) {
21
+ const frames = input.map(withoutProblems);
22
+ const limits = { head: WS_HISTORY_HEAD, tail: WS_HISTORY_TAIL, maxBytes: WS_HISTORY_MAX_BYTES };
23
+ const r = capByEnds(frames, limits, (frame) => frame.size, (frame) => {
15
24
  if (frame.text === undefined && frame.base64 === undefined)
16
- return frame;
17
- stripped = true;
25
+ return undefined;
18
26
  return {
19
27
  index: frame.index,
20
28
  direction: frame.direction,
@@ -22,8 +30,9 @@ export function capFrames(frames) {
22
30
  at: frame.at,
23
31
  size: frame.size,
24
32
  ...(frame.close !== undefined ? { close: frame.close } : {}),
33
+ ...(frame.contract !== undefined ? { contract: frame.contract } : {}),
25
34
  payloadTruncated: true,
26
35
  };
27
36
  });
28
- return { frames: capped, truncated: omittedFrames > 0 || stripped, omittedFrames };
37
+ return { frames: r.items, truncated: r.truncated, omittedFrames: r.omitted };
29
38
  }
package/dist/ws/url.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { KeyValueEntry } from '../rest/model.js';
1
+ import type { KeyValueEntry } from '../http/entries.js';
2
2
  /** The URL a session dials: the request's own when absolute, else its path under the server URL. */
3
3
  export declare function resolveWsUrl(serverUrl: string, requestUrl: string, query: readonly KeyValueEntry[]): string;
@@ -13,7 +13,7 @@ import { definitionCacheManifestSchema, parseFile } from '../project/schema.js';
13
13
  import { nodeFs, readFileIfExists, readdirIfExists, writeFileAtomic } from '../project/fs.js';
14
14
  import { parseYaml, stringifyYaml } from '../project/yaml.js';
15
15
  import { parseXml } from '../xml/parse.js';
16
- import { assignFileNames } from './cache-naming.js';
16
+ import { assignFileNames } from '../project/cache-naming.js';
17
17
  const MANIFEST_FILE = 'manifest.yaml';
18
18
  /** Hex-encoded SHA-256 digest of `bytes`, used to verify cached documents haven't been tampered with or corrupted. */
19
19
  function sha256Hex(bytes) {
@@ -3,12 +3,12 @@
3
3
  * single self-contained document — HTML (inline CSS, no scripts, everything
4
4
  * escaped) or Markdown (with a table of contents).
5
5
  *
6
- * Pure and deterministic: the same {@link ImportResult} always produces
6
+ * Pure and deterministic: the same {@link WsdlImportResult} always produces
7
7
  * byte-identical output, so the golden tests are meaningful and a regenerated
8
8
  * document is a clean diff. Nothing is fetched; every byte comes from the
9
9
  * bundle the import already resolved.
10
10
  */
11
- import type { ImportResult } from '../types.js';
11
+ import type { WsdlImportResult } from '../soap/types.js';
12
12
  /** Options accepted by {@link generateDocs}. */
13
13
  export interface GenerateDocsOptions {
14
14
  readonly format: 'html' | 'markdown';
@@ -44,4 +44,4 @@ export declare function sourceSnippet(text: string, line: number, maxLines?: num
44
44
  * @param options output format and an optional title
45
45
  * @returns the whole document as a string; the caller decides where it lands
46
46
  */
47
- export declare function generateDocs(result: ImportResult, options: GenerateDocsOptions): string;
47
+ export declare function generateDocs(result: WsdlImportResult, options: GenerateDocsOptions): string;
@@ -3,7 +3,7 @@
3
3
  * single self-contained document — HTML (inline CSS, no scripts, everything
4
4
  * escaped) or Markdown (with a table of contents).
5
5
  *
6
- * Pure and deterministic: the same {@link ImportResult} always produces
6
+ * Pure and deterministic: the same {@link WsdlImportResult} always produces
7
7
  * byte-identical output, so the golden tests are meaningful and a regenerated
8
8
  * document is a clean diff. Nothing is fetched; every byte comes from the
9
9
  * bundle the import already resolved.
@@ -13,7 +13,7 @@ import { writeFileAtomic } from '../project/fs.js';
13
13
  import { NS } from '../xml/namespaces.js';
14
14
  import { parseXml } from '../xml/parse.js';
15
15
  import { serializeXml } from '../xml/serialize.js';
16
- import { assignFileNames } from './cache-naming.js';
16
+ import { assignFileNames } from '../project/cache-naming.js';
17
17
  import { childElements, firstChildElement, optionalAttribute } from './dom-utils.js';
18
18
  /** Resolves `ref` (an import/include/redefine location) against `base` using the WHATWG `URL` class. */
19
19
  function resolveUrl(ref, base) {
@@ -1,9 +1,6 @@
1
1
  import type { Element } from '@xmldom/xmldom';
2
- /** A namespace-qualified name: an expanded `{namespaceUri}localName` pair. */
3
- export interface QName {
4
- readonly namespaceUri: string;
5
- readonly localName: string;
6
- }
2
+ import type { QName } from '../xml/qname.js';
3
+ export type { QName };
7
4
  /**
8
5
  * Resolves a (possibly prefixed) QName string against the namespaces in
9
6
  * scope at `contextElement`, walking ancestors via `lookupNamespaceURI`.
@@ -1,4 +1,5 @@
1
1
  import type { Document } from '@xmldom/xmldom';
2
+ import type { FetchDocument, FetchedDocument } from '../http/fetch-document.js';
2
3
  /** The root document to resolve, plus an optional pre-fetched body (avoids a redundant fetch of the root). */
3
4
  export interface DefinitionSource {
4
5
  /** Absolute URL (`http(s)://` or `file://`) identifying the root document. */
@@ -6,15 +7,7 @@ export interface DefinitionSource {
6
7
  /** Pre-fetched root document text, when the caller already has it in hand. */
7
8
  readonly text?: string;
8
9
  }
9
- /** A fetched document's canonical location (post-redirect) and raw content. */
10
- export interface FetchedDocument {
11
- /** The final absolute location after following any redirects. */
12
- readonly location: string;
13
- readonly bytes: Uint8Array;
14
- readonly text: string;
15
- }
16
- /** Fetches a single document by absolute location, honouring an optional abort signal. */
17
- export type FetchDocument = (location: string, signal?: AbortSignal) => Promise<FetchedDocument>;
10
+ export type { FetchDocument, FetchedDocument };
18
11
  /** Options for {@link resolveDefinition}. */
19
12
  export interface ResolveOptions {
20
13
  readonly fetchDocument: FetchDocument;
@@ -40,7 +33,7 @@ export interface BundledDocument {
40
33
  /** A non-fatal problem encountered while resolving an import graph. */
41
34
  export interface ResolveProblem {
42
35
  readonly code: 'unsupported-redefine' | 'fetch-failed' | 'unresolved-import' | 'not-xml'
43
- /** A reference the {@link ReferencePolicy} refused; see `wsdl/ref-policy.ts`. */
36
+ /** A reference the {@link ReferencePolicy} refused; see `http/ref-policy.ts`. */
44
37
  | 'import-ref-refused'
45
38
  /** The graph hit the depth or document cap; everything resolved so far is still returned. */
46
39
  | 'import-limit';
@@ -63,7 +56,7 @@ export interface DefinitionBundle {
63
56
  * location) through the injected `fetchDocument`.
64
57
  *
65
58
  * Every nested reference is first judged against the root document's world (see
66
- * `wsdl/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
59
+ * `http/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
67
60
  * folder, an `http(s):` root may only reference `http(s):` documents, and a pasted/dropped
68
61
  * root may only reference `http(s):` documents. A refused reference becomes an
69
62
  * `import-ref-refused` problem and the import continues with what did resolve — so a WSDL
@@ -2,7 +2,7 @@ import { WsdlParseError } from '../errors.js';
2
2
  import { NS } from '../xml/namespaces.js';
3
3
  import { getPosition, parseXml } from '../xml/parse.js';
4
4
  import { childElements, firstChildElement, optionalAttribute } from './dom-utils.js';
5
- import { MAX_IMPORT_DEPTH, MAX_IMPORT_DOCUMENTS, referencePolicyFor } from './ref-policy.js';
5
+ import { MAX_IMPORT_DEPTH, MAX_IMPORT_DOCUMENTS, referencePolicyFor } from '../http/ref-policy.js';
6
6
  /**
7
7
  * Queues `ref`, resolved against `base` with the WHATWG `URL` class (which handles both
8
8
  * `http(s):` and `file:`).
@@ -159,7 +159,7 @@ function checkAborted(signal) {
159
159
  * location) through the injected `fetchDocument`.
160
160
  *
161
161
  * Every nested reference is first judged against the root document's world (see
162
- * `wsdl/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
162
+ * `http/ref-policy.ts`): a `file:` root may only reference `file:` documents inside its own
163
163
  * folder, an `http(s):` root may only reference `http(s):` documents, and a pasted/dropped
164
164
  * root may only reference `http(s):` documents. A refused reference becomes an
165
165
  * `import-ref-refused` problem and the import continues with what did resolve — so a WSDL
@@ -199,7 +199,7 @@ export async function resolveDefinition(source, options) {
199
199
  const rootDoc = buildBundledDocument(rootFetched, source.location, undefined, undefined, true);
200
200
  canonicalDocs.set(rootFetched.location, rootDoc);
201
201
  const documents = [rootDoc];
202
- // Every nested reference is judged against the *root* document's world; see `ref-policy.ts`.
202
+ // Every nested reference is judged against the *root* document's world; see `http/ref-policy.ts`.
203
203
  const policy = referencePolicyFor(rootFetched.location);
204
204
  const queue = [];
205
205
  collectImports(rootDoc, 1, queue, problems);
@@ -3,7 +3,7 @@
3
3
  * project against it.
4
4
  *
5
5
  * The two halves are deliberately separate. {@link planUpdate} is a pure diff of
6
- * two {@link ImportResult}s — what a preview dialog shows before the user commits
6
+ * two {@link WsdlImportResult}s — what a preview dialog shows before the user commits
7
7
  * to anything. {@link applyUpdate} then rewrites the project model per the
8
8
  * options the user ticked, and is equally pure: it returns the next `Project`
9
9
  * plus the relative paths of the `.xml.bak` backups the save layer should write
@@ -11,13 +11,13 @@
11
11
  * itself.
12
12
  *
13
13
  * Nothing is ever deleted. Requests belonging to an operation the new definition
14
- * no longer has are kept and flagged {@link RequestDef.orphaned} rather than
14
+ * no longer has are kept and flagged {@link SoapRequestDef.orphaned} rather than
15
15
  * removed — the user decides whether a vanished operation means "clean
16
16
  * this up" or "the new WSDL is wrong".
17
17
  */
18
18
  import type { IdGenerator, Project } from '../project/model.js';
19
19
  import type { OperationRef } from '../soap/request-builder.js';
20
- import type { ImportResult } from '../types.js';
20
+ import type { WsdlImportResult } from '../soap/types.js';
21
21
  export type { OperationRef } from '../soap/request-builder.js';
22
22
  /** Why {@link planUpdate} considers an operation changed; the first applicable reason wins. */
23
23
  export type OperationChangeReason = 'input-schema' | 'output-schema' | 'soap-action' | 'style' | 'binding';
@@ -51,7 +51,7 @@ export interface UpdatePlan {
51
51
  * @param oldImport the definition the project was built from
52
52
  * @param newImport the freshly fetched definition
53
53
  */
54
- export declare function planUpdate(oldImport: ImportResult, newImport: ImportResult): UpdatePlan;
54
+ export declare function planUpdate(oldImport: WsdlImportResult, newImport: WsdlImportResult): UpdatePlan;
55
55
  /**
56
56
  * What {@link applyUpdate} is allowed to do, named after the checkboxes of
57
57
  * the Update Definition dialog.
@@ -103,4 +103,4 @@ export interface ApplyUpdateResult {
103
103
  * @param options which of the update behaviours to perform
104
104
  * @throws Error when `interfaceId` names no interface of `project`
105
105
  */
106
- export declare function applyUpdate(project: Project, interfaceId: string, plan: UpdatePlan, newImport: ImportResult, options: ApplyUpdateOptions): ApplyUpdateResult;
106
+ export declare function applyUpdate(project: Project, interfaceId: string, plan: UpdatePlan, newImport: WsdlImportResult, options: ApplyUpdateOptions): ApplyUpdateResult;
@@ -3,7 +3,7 @@
3
3
  * project against it.
4
4
  *
5
5
  * The two halves are deliberately separate. {@link planUpdate} is a pure diff of
6
- * two {@link ImportResult}s — what a preview dialog shows before the user commits
6
+ * two {@link WsdlImportResult}s — what a preview dialog shows before the user commits
7
7
  * to anything. {@link applyUpdate} then rewrites the project model per the
8
8
  * options the user ticked, and is equally pure: it returns the next `Project`
9
9
  * plus the relative paths of the `.xml.bak` backups the save layer should write
@@ -11,11 +11,11 @@
11
11
  * itself.
12
12
  *
13
13
  * Nothing is ever deleted. Requests belonging to an operation the new definition
14
- * no longer has are kept and flagged {@link RequestDef.orphaned} rather than
14
+ * no longer has are kept and flagged {@link SoapRequestDef.orphaned} rather than
15
15
  * removed — the user decides whether a vanished operation means "clean
16
16
  * this up" or "the new WSDL is wrong".
17
17
  */
18
- import { generateRequest } from '../generate.js';
18
+ import { generateSoapRequest } from '../soap/generate.js';
19
19
  import { createRequest, generateId } from '../project/model.js';
20
20
  import { INTERFACES_DIR, OPERATIONS_DIR, uniqueSlug } from '../project/paths.js';
21
21
  import { recreateRequest } from '../soap/recreate.js';
@@ -51,7 +51,7 @@ function addressesOf(summary) {
51
51
  /** The generated sample envelope for one operation, or `undefined` when it cannot be built. */
52
52
  function envelopeOf(result, ref) {
53
53
  try {
54
- return generateRequest(result, ref, DIFF_GENERATE_OPTIONS).envelopeXml;
54
+ return generateSoapRequest(result, ref, DIFF_GENERATE_OPTIONS).envelopeXml;
55
55
  }
56
56
  catch {
57
57
  return undefined;
@@ -236,7 +236,7 @@ export function applyUpdate(project, interfaceId, plan, newImport, options) {
236
236
  if (recreate) {
237
237
  const summary = summaryFor(newImport, key);
238
238
  if (summary !== undefined) {
239
- const generated = generateRequest(newImport, refOf(summary), generateOptions);
239
+ const generated = generateSoapRequest(newImport, refOf(summary), generateOptions);
240
240
  const merged = recreateRequest(next.envelopeXml, generated.envelopeXml, {
241
241
  keepValues: options.keepExisting,
242
242
  keepHeaders: options.keepSoapHeaders,
@@ -274,7 +274,7 @@ export function applyUpdate(project, interfaceId, plan, newImport, options) {
274
274
  order: iface.operations.length,
275
275
  requests: [],
276
276
  };
277
- const generated = generateRequest(newImport, ref, generateOptions);
277
+ const generated = generateSoapRequest(newImport, ref, generateOptions);
278
278
  const name = 'Request 1';
279
279
  const request = createRequest(name, {
280
280
  id: newId(),