@wirebench/engine 2.1.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 (583) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/dist/assert/contract.d.ts +3 -0
  4. package/dist/assert/contract.js +17 -0
  5. package/dist/assert/index.d.ts +4 -0
  6. package/dist/assert/index.js +27 -0
  7. package/dist/assert/match.d.ts +3 -0
  8. package/dist/assert/match.js +58 -0
  9. package/dist/assert/model.d.ts +73 -0
  10. package/dist/assert/model.js +8 -0
  11. package/dist/assert/schema.d.ts +34 -0
  12. package/dist/assert/schema.js +46 -0
  13. package/dist/assert/sla.d.ts +3 -0
  14. package/dist/assert/sla.js +8 -0
  15. package/dist/assert/soap-fault.d.ts +3 -0
  16. package/dist/assert/soap-fault.js +20 -0
  17. package/dist/assert/status.d.ts +3 -0
  18. package/dist/assert/status.js +14 -0
  19. package/dist/errors.d.ts +77 -0
  20. package/dist/errors.js +121 -0
  21. package/dist/fs.d.ts +35 -0
  22. package/dist/fs.js +64 -0
  23. package/dist/generate.d.ts +12 -0
  24. package/dist/generate.js +14 -0
  25. package/dist/grpc/browser.d.ts +11 -0
  26. package/dist/grpc/browser.js +9 -0
  27. package/dist/grpc/cache.d.ts +113 -0
  28. package/dist/grpc/cache.js +244 -0
  29. package/dist/grpc/call.d.ts +64 -0
  30. package/dist/grpc/call.js +72 -0
  31. package/dist/grpc/codec.d.ts +29 -0
  32. package/dist/grpc/codec.js +416 -0
  33. package/dist/grpc/command.d.ts +23 -0
  34. package/dist/grpc/command.js +91 -0
  35. package/dist/grpc/expand.d.ts +25 -0
  36. package/dist/grpc/expand.js +52 -0
  37. package/dist/grpc/framing.d.ts +28 -0
  38. package/dist/grpc/framing.js +61 -0
  39. package/dist/grpc/import.d.ts +47 -0
  40. package/dist/grpc/import.js +88 -0
  41. package/dist/grpc/model.d.ts +179 -0
  42. package/dist/grpc/model.js +91 -0
  43. package/dist/grpc/proto/describe.d.ts +92 -0
  44. package/dist/grpc/proto/describe.js +205 -0
  45. package/dist/grpc/proto/load.d.ts +35 -0
  46. package/dist/grpc/proto/load.js +112 -0
  47. package/dist/grpc/proto/sample.d.ts +21 -0
  48. package/dist/grpc/proto/sample.js +79 -0
  49. package/dist/grpc/proto/well-known.d.ts +42 -0
  50. package/dist/grpc/proto/well-known.js +143 -0
  51. package/dist/grpc/reconcile.d.ts +42 -0
  52. package/dist/grpc/reconcile.js +153 -0
  53. package/dist/grpc/reflection/client.d.ts +70 -0
  54. package/dist/grpc/reflection/client.js +197 -0
  55. package/dist/grpc/reflection/descriptors.d.ts +69 -0
  56. package/dist/grpc/reflection/descriptors.js +140 -0
  57. package/dist/grpc/reflection/proto.d.ts +33 -0
  58. package/dist/grpc/reflection/proto.js +144 -0
  59. package/dist/grpc/send.d.ts +132 -0
  60. package/dist/grpc/send.js +435 -0
  61. package/dist/grpc/shape.d.ts +29 -0
  62. package/dist/grpc/shape.js +36 -0
  63. package/dist/grpc/status.d.ts +21 -0
  64. package/dist/grpc/status.js +62 -0
  65. package/dist/grpc/target.d.ts +21 -0
  66. package/dist/grpc/target.js +66 -0
  67. package/dist/http/auth/apply.d.ts +37 -0
  68. package/dist/http/auth/apply.js +74 -0
  69. package/dist/http/auth/basic.d.ts +36 -0
  70. package/dist/http/auth/basic.js +69 -0
  71. package/dist/http/auth/md4.d.ts +13 -0
  72. package/dist/http/auth/md4.js +81 -0
  73. package/dist/http/auth/ntlm-transport.d.ts +61 -0
  74. package/dist/http/auth/ntlm-transport.js +97 -0
  75. package/dist/http/auth/ntlm.d.ts +190 -0
  76. package/dist/http/auth/ntlm.js +377 -0
  77. package/dist/http/client.d.ts +73 -0
  78. package/dist/http/client.js +403 -0
  79. package/dist/http/curl-flags.d.ts +15 -0
  80. package/dist/http/curl-flags.js +95 -0
  81. package/dist/http/curl.d.ts +94 -0
  82. package/dist/http/curl.js +245 -0
  83. package/dist/http/decompress.d.ts +7 -0
  84. package/dist/http/decompress.js +22 -0
  85. package/dist/http/errors.d.ts +22 -0
  86. package/dist/http/errors.js +144 -0
  87. package/dist/http/failed-request.d.ts +27 -0
  88. package/dist/http/failed-request.js +48 -0
  89. package/dist/http/headers.d.ts +15 -0
  90. package/dist/http/headers.js +50 -0
  91. package/dist/http/heredoc.d.ts +25 -0
  92. package/dist/http/heredoc.js +74 -0
  93. package/dist/http/proxy.d.ts +103 -0
  94. package/dist/http/proxy.js +168 -0
  95. package/dist/http/raw-capture.d.ts +23 -0
  96. package/dist/http/raw-capture.js +57 -0
  97. package/dist/http/timings.d.ts +79 -0
  98. package/dist/http/timings.js +212 -0
  99. package/dist/http/tls.d.ts +111 -0
  100. package/dist/http/tls.js +167 -0
  101. package/dist/http/types.d.ts +125 -0
  102. package/dist/http/types.js +6 -0
  103. package/dist/import-detect.d.ts +26 -0
  104. package/dist/import-detect.js +169 -0
  105. package/dist/import.d.ts +20 -0
  106. package/dist/import.js +163 -0
  107. package/dist/index.d.ts +272 -0
  108. package/dist/index.js +157 -0
  109. package/dist/json/cursor.d.ts +43 -0
  110. package/dist/json/cursor.js +168 -0
  111. package/dist/operations.d.ts +12 -0
  112. package/dist/operations.js +52 -0
  113. package/dist/project/attachments-cache.d.ts +80 -0
  114. package/dist/project/attachments-cache.js +186 -0
  115. package/dist/project/endpoints.d.ts +23 -0
  116. package/dist/project/endpoints.js +47 -0
  117. package/dist/project/environments.d.ts +68 -0
  118. package/dist/project/environments.js +124 -0
  119. package/dist/project/fs.d.ts +45 -0
  120. package/dist/project/fs.js +78 -0
  121. package/dist/project/history.d.ts +171 -0
  122. package/dist/project/history.js +179 -0
  123. package/dist/project/keystores.d.ts +24 -0
  124. package/dist/project/keystores.js +66 -0
  125. package/dist/project/load.d.ts +44 -0
  126. package/dist/project/load.js +634 -0
  127. package/dist/project/migrate.d.ts +27 -0
  128. package/dist/project/migrate.js +46 -0
  129. package/dist/project/model.d.ts +401 -0
  130. package/dist/project/model.js +126 -0
  131. package/dist/project/paths.d.ts +134 -0
  132. package/dist/project/paths.js +259 -0
  133. package/dist/project/preferences.d.ts +318 -0
  134. package/dist/project/preferences.js +239 -0
  135. package/dist/project/properties.d.ts +97 -0
  136. package/dist/project/properties.js +356 -0
  137. package/dist/project/save.d.ts +65 -0
  138. package/dist/project/save.js +295 -0
  139. package/dist/project/schema.d.ts +1329 -0
  140. package/dist/project/schema.js +737 -0
  141. package/dist/project/serialize.d.ts +42 -0
  142. package/dist/project/serialize.js +385 -0
  143. package/dist/project/wss-configs.d.ts +40 -0
  144. package/dist/project/wss-configs.js +142 -0
  145. package/dist/project/yaml.d.ts +17 -0
  146. package/dist/project/yaml.js +39 -0
  147. package/dist/redact/index.d.ts +77 -0
  148. package/dist/redact/index.js +328 -0
  149. package/dist/redact/literal.d.ts +12 -0
  150. package/dist/redact/literal.js +68 -0
  151. package/dist/rest/auth.d.ts +53 -0
  152. package/dist/rest/auth.js +80 -0
  153. package/dist/rest/body.d.ts +61 -0
  154. package/dist/rest/body.js +184 -0
  155. package/dist/rest/browser.d.ts +12 -0
  156. package/dist/rest/browser.js +11 -0
  157. package/dist/rest/cookies.d.ts +41 -0
  158. package/dist/rest/cookies.js +102 -0
  159. package/dist/rest/curl.d.ts +75 -0
  160. package/dist/rest/curl.js +417 -0
  161. package/dist/rest/expand.d.ts +35 -0
  162. package/dist/rest/expand.js +104 -0
  163. package/dist/rest/model.d.ts +247 -0
  164. package/dist/rest/model.js +118 -0
  165. package/dist/rest/oauth2.d.ts +118 -0
  166. package/dist/rest/oauth2.js +212 -0
  167. package/dist/rest/openapi/cache.d.ts +54 -0
  168. package/dist/rest/openapi/cache.js +128 -0
  169. package/dist/rest/openapi/import.d.ts +67 -0
  170. package/dist/rest/openapi/import.js +91 -0
  171. package/dist/rest/openapi/map.d.ts +102 -0
  172. package/dist/rest/openapi/map.js +477 -0
  173. package/dist/rest/openapi/model.d.ts +203 -0
  174. package/dist/rest/openapi/model.js +37 -0
  175. package/dist/rest/openapi/parse.d.ts +44 -0
  176. package/dist/rest/openapi/parse.js +1530 -0
  177. package/dist/rest/openapi/refs.d.ts +63 -0
  178. package/dist/rest/openapi/refs.js +258 -0
  179. package/dist/rest/openapi/sample.d.ts +68 -0
  180. package/dist/rest/openapi/sample.js +336 -0
  181. package/dist/rest/postman/import.d.ts +21 -0
  182. package/dist/rest/postman/import.js +47 -0
  183. package/dist/rest/postman/index.d.ts +7 -0
  184. package/dist/rest/postman/index.js +7 -0
  185. package/dist/rest/postman/map.d.ts +28 -0
  186. package/dist/rest/postman/map.js +427 -0
  187. package/dist/rest/postman/model.d.ts +118 -0
  188. package/dist/rest/postman/model.js +7 -0
  189. package/dist/rest/postman/parse.d.ts +29 -0
  190. package/dist/rest/postman/parse.js +518 -0
  191. package/dist/rest/response.d.ts +72 -0
  192. package/dist/rest/response.js +221 -0
  193. package/dist/rest/send.d.ts +102 -0
  194. package/dist/rest/send.js +148 -0
  195. package/dist/rest/url.d.ts +92 -0
  196. package/dist/rest/url.js +213 -0
  197. package/dist/run/effective-auth.d.ts +10 -0
  198. package/dist/run/effective-auth.js +19 -0
  199. package/dist/run/index.d.ts +8 -0
  200. package/dist/run/index.js +4 -0
  201. package/dist/run/prepare.d.ts +43 -0
  202. package/dist/run/prepare.js +280 -0
  203. package/dist/run/run.d.ts +53 -0
  204. package/dist/run/run.js +223 -0
  205. package/dist/run/secret-needs.d.ts +13 -0
  206. package/dist/run/secret-needs.js +125 -0
  207. package/dist/run/select.d.ts +34 -0
  208. package/dist/run/select.js +76 -0
  209. package/dist/secrets/env-names.d.ts +27 -0
  210. package/dist/secrets/env-names.js +40 -0
  211. package/dist/secrets/resolve.d.ts +58 -0
  212. package/dist/secrets/resolve.js +136 -0
  213. package/dist/send-options.d.ts +141 -0
  214. package/dist/send-options.js +228 -0
  215. package/dist/send.d.ts +53 -0
  216. package/dist/send.js +210 -0
  217. package/dist/soap/body-builder.d.ts +38 -0
  218. package/dist/soap/body-builder.js +250 -0
  219. package/dist/soap/build-problems.d.ts +12 -0
  220. package/dist/soap/build-problems.js +2 -0
  221. package/dist/soap/charset.d.ts +23 -0
  222. package/dist/soap/charset.js +47 -0
  223. package/dist/soap/envelope.d.ts +44 -0
  224. package/dist/soap/envelope.js +76 -0
  225. package/dist/soap/fault.d.ts +46 -0
  226. package/dist/soap/fault.js +129 -0
  227. package/dist/soap/form-request.d.ts +34 -0
  228. package/dist/soap/form-request.js +251 -0
  229. package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
  230. package/dist/soap/legacy-project/definition-fetcher.js +43 -0
  231. package/dist/soap/legacy-project/format.d.ts +18 -0
  232. package/dist/soap/legacy-project/format.js +24 -0
  233. package/dist/soap/legacy-project/import.d.ts +21 -0
  234. package/dist/soap/legacy-project/import.js +46 -0
  235. package/dist/soap/legacy-project/index.d.ts +9 -0
  236. package/dist/soap/legacy-project/index.js +5 -0
  237. package/dist/soap/legacy-project/map.d.ts +91 -0
  238. package/dist/soap/legacy-project/map.js +290 -0
  239. package/dist/soap/legacy-project/model.d.ts +98 -0
  240. package/dist/soap/legacy-project/model.js +5 -0
  241. package/dist/soap/legacy-project/parse.d.ts +16 -0
  242. package/dist/soap/legacy-project/parse.js +325 -0
  243. package/dist/soap/mime/cid-scan.d.ts +36 -0
  244. package/dist/soap/mime/cid-scan.js +52 -0
  245. package/dist/soap/mime/inline-files.d.ts +39 -0
  246. package/dist/soap/mime/inline-files.js +71 -0
  247. package/dist/soap/mime/mtom.d.ts +74 -0
  248. package/dist/soap/mime/mtom.js +134 -0
  249. package/dist/soap/mime/multipart.d.ts +66 -0
  250. package/dist/soap/mime/multipart.js +329 -0
  251. package/dist/soap/mime/send-pipeline.d.ts +61 -0
  252. package/dist/soap/mime/send-pipeline.js +145 -0
  253. package/dist/soap/mime/swa.d.ts +45 -0
  254. package/dist/soap/mime/swa.js +62 -0
  255. package/dist/soap/mime/types.d.ts +69 -0
  256. package/dist/soap/mime/types.js +10 -0
  257. package/dist/soap/namespace-scope.d.ts +32 -0
  258. package/dist/soap/namespace-scope.js +85 -0
  259. package/dist/soap/prefixes.d.ts +24 -0
  260. package/dist/soap/prefixes.js +70 -0
  261. package/dist/soap/recreate.d.ts +28 -0
  262. package/dist/soap/recreate.js +168 -0
  263. package/dist/soap/request-builder.d.ts +63 -0
  264. package/dist/soap/request-builder.js +161 -0
  265. package/dist/soap/response-parser.d.ts +29 -0
  266. package/dist/soap/response-parser.js +71 -0
  267. package/dist/soap/soap-action.d.ts +31 -0
  268. package/dist/soap/soap-action.js +28 -0
  269. package/dist/soap/transforms.d.ts +52 -0
  270. package/dist/soap/transforms.js +164 -0
  271. package/dist/types.d.ts +307 -0
  272. package/dist/types.js +6 -0
  273. package/dist/validate/index.d.ts +61 -0
  274. package/dist/validate/index.js +72 -0
  275. package/dist/validate/schema-file-set.d.ts +51 -0
  276. package/dist/validate/schema-file-set.js +288 -0
  277. package/dist/validate/schema-validator.d.ts +53 -0
  278. package/dist/validate/schema-validator.js +251 -0
  279. package/dist/validate/soap-structure.d.ts +34 -0
  280. package/dist/validate/soap-structure.js +255 -0
  281. package/dist/validate/types.d.ts +47 -0
  282. package/dist/validate/types.js +8 -0
  283. package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
  284. package/dist/validate/wsi/assertions/helpers.js +387 -0
  285. package/dist/validate/wsi/assertions/index.d.ts +44 -0
  286. package/dist/validate/wsi/assertions/index.js +77 -0
  287. package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
  288. package/dist/validate/wsi/assertions/message/helpers.js +168 -0
  289. package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
  290. package/dist/validate/wsi/assertions/message/index.js +62 -0
  291. package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
  292. package/dist/validate/wsi/assertions/message/r1001.js +38 -0
  293. package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
  294. package/dist/validate/wsi/assertions/message/r1003.js +45 -0
  295. package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
  296. package/dist/validate/wsi/assertions/message/r1005.js +37 -0
  297. package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
  298. package/dist/validate/wsi/assertions/message/r1006.js +49 -0
  299. package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
  300. package/dist/validate/wsi/assertions/message/r1007.js +30 -0
  301. package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
  302. package/dist/validate/wsi/assertions/message/r1011.js +33 -0
  303. package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
  304. package/dist/validate/wsi/assertions/message/r1012.js +37 -0
  305. package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
  306. package/dist/validate/wsi/assertions/message/r1013.js +42 -0
  307. package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
  308. package/dist/validate/wsi/assertions/message/r1014.js +30 -0
  309. package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
  310. package/dist/validate/wsi/assertions/message/r1015.js +36 -0
  311. package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
  312. package/dist/validate/wsi/assertions/message/r1017.js +30 -0
  313. package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
  314. package/dist/validate/wsi/assertions/message/r1100.js +39 -0
  315. package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
  316. package/dist/validate/wsi/assertions/message/r1101.js +37 -0
  317. package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
  318. package/dist/validate/wsi/assertions/message/r1102.js +41 -0
  319. package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
  320. package/dist/validate/wsi/assertions/message/r1103.js +28 -0
  321. package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
  322. package/dist/validate/wsi/assertions/message/r1107.js +38 -0
  323. package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
  324. package/dist/validate/wsi/assertions/message/r1109.js +32 -0
  325. package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
  326. package/dist/validate/wsi/assertions/message/r1124.js +31 -0
  327. package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
  328. package/dist/validate/wsi/assertions/message/r1132.js +23 -0
  329. package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
  330. package/dist/validate/wsi/assertions/message/r1140.js +42 -0
  331. package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
  332. package/dist/validate/wsi/assertions/message/r1141.js +32 -0
  333. package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
  334. package/dist/validate/wsi/assertions/message/r2113.js +33 -0
  335. package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
  336. package/dist/validate/wsi/assertions/message/r2211.js +42 -0
  337. package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
  338. package/dist/validate/wsi/assertions/r2001.js +47 -0
  339. package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
  340. package/dist/validate/wsi/assertions/r2002.js +38 -0
  341. package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
  342. package/dist/validate/wsi/assertions/r2003.js +32 -0
  343. package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
  344. package/dist/validate/wsi/assertions/r2005.js +40 -0
  345. package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
  346. package/dist/validate/wsi/assertions/r2101.js +65 -0
  347. package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
  348. package/dist/validate/wsi/assertions/r2102.js +41 -0
  349. package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
  350. package/dist/validate/wsi/assertions/r2105.js +39 -0
  351. package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
  352. package/dist/validate/wsi/assertions/r2110.js +38 -0
  353. package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
  354. package/dist/validate/wsi/assertions/r2111.js +30 -0
  355. package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
  356. package/dist/validate/wsi/assertions/r2112.js +35 -0
  357. package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
  358. package/dist/validate/wsi/assertions/r2201.js +28 -0
  359. package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
  360. package/dist/validate/wsi/assertions/r2203.js +30 -0
  361. package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
  362. package/dist/validate/wsi/assertions/r2204.js +29 -0
  363. package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
  364. package/dist/validate/wsi/assertions/r2205.js +46 -0
  365. package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
  366. package/dist/validate/wsi/assertions/r2206.js +36 -0
  367. package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
  368. package/dist/validate/wsi/assertions/r2209.js +37 -0
  369. package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
  370. package/dist/validate/wsi/assertions/r2210.js +30 -0
  371. package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
  372. package/dist/validate/wsi/assertions/r2303.js +44 -0
  373. package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
  374. package/dist/validate/wsi/assertions/r2304.js +32 -0
  375. package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
  376. package/dist/validate/wsi/assertions/r2401.js +31 -0
  377. package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
  378. package/dist/validate/wsi/assertions/r2701.js +28 -0
  379. package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
  380. package/dist/validate/wsi/assertions/r2702.js +26 -0
  381. package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
  382. package/dist/validate/wsi/assertions/r2705.js +31 -0
  383. package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
  384. package/dist/validate/wsi/assertions/r2706.js +29 -0
  385. package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
  386. package/dist/validate/wsi/assertions/r2710.js +37 -0
  387. package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
  388. package/dist/validate/wsi/assertions/r2716.js +29 -0
  389. package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
  390. package/dist/validate/wsi/assertions/r2717.js +31 -0
  391. package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
  392. package/dist/validate/wsi/assertions/r2718.js +41 -0
  393. package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
  394. package/dist/validate/wsi/assertions/r2720.js +29 -0
  395. package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
  396. package/dist/validate/wsi/assertions/r2721.js +27 -0
  397. package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
  398. package/dist/validate/wsi/assertions/r2722.js +29 -0
  399. package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
  400. package/dist/validate/wsi/assertions/r2801.js +39 -0
  401. package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
  402. package/dist/validate/wsi/assertions/r2803.js +29 -0
  403. package/dist/validate/wsi/docs.d.ts +29 -0
  404. package/dist/validate/wsi/docs.js +167 -0
  405. package/dist/validate/wsi/index.d.ts +16 -0
  406. package/dist/validate/wsi/index.js +11 -0
  407. package/dist/validate/wsi/report-html.d.ts +36 -0
  408. package/dist/validate/wsi/report-html.js +135 -0
  409. package/dist/validate/wsi/run-message.d.ts +50 -0
  410. package/dist/validate/wsi/run-message.js +190 -0
  411. package/dist/validate/wsi/run-wsdl.d.ts +48 -0
  412. package/dist/validate/wsi/run-wsdl.js +99 -0
  413. package/dist/validate/wsi/types.d.ts +173 -0
  414. package/dist/validate/wsi/types.js +17 -0
  415. package/dist/workspace/commit-message.d.ts +47 -0
  416. package/dist/workspace/commit-message.js +195 -0
  417. package/dist/workspace/environments.d.ts +79 -0
  418. package/dist/workspace/environments.js +115 -0
  419. package/dist/workspace/index.d.ts +28 -0
  420. package/dist/workspace/index.js +19 -0
  421. package/dist/workspace/load.d.ts +45 -0
  422. package/dist/workspace/load.js +155 -0
  423. package/dist/workspace/local-state.d.ts +37 -0
  424. package/dist/workspace/local-state.js +59 -0
  425. package/dist/workspace/migrate.d.ts +38 -0
  426. package/dist/workspace/migrate.js +50 -0
  427. package/dist/workspace/model.d.ts +86 -0
  428. package/dist/workspace/model.js +54 -0
  429. package/dist/workspace/paths.d.ts +64 -0
  430. package/dist/workspace/paths.js +97 -0
  431. package/dist/workspace/reidentify.d.ts +22 -0
  432. package/dist/workspace/reidentify.js +122 -0
  433. package/dist/workspace/save.d.ts +31 -0
  434. package/dist/workspace/save.js +84 -0
  435. package/dist/workspace/schema.d.ts +93 -0
  436. package/dist/workspace/schema.js +115 -0
  437. package/dist/workspace/serialize.d.ts +24 -0
  438. package/dist/workspace/serialize.js +60 -0
  439. package/dist/workspace/share.d.ts +52 -0
  440. package/dist/workspace/share.js +89 -0
  441. package/dist/ws/browser.d.ts +13 -0
  442. package/dist/ws/browser.js +11 -0
  443. package/dist/ws/call.d.ts +53 -0
  444. package/dist/ws/call.js +106 -0
  445. package/dist/ws/command.d.ts +19 -0
  446. package/dist/ws/command.js +28 -0
  447. package/dist/ws/expand.d.ts +38 -0
  448. package/dist/ws/expand.js +76 -0
  449. package/dist/ws/model.d.ts +191 -0
  450. package/dist/ws/model.js +83 -0
  451. package/dist/ws/pretty.d.ts +12 -0
  452. package/dist/ws/pretty.js +25 -0
  453. package/dist/ws/session.d.ts +50 -0
  454. package/dist/ws/session.js +333 -0
  455. package/dist/ws/shape.d.ts +18 -0
  456. package/dist/ws/shape.js +28 -0
  457. package/dist/ws/transcript.d.ts +14 -0
  458. package/dist/ws/transcript.js +29 -0
  459. package/dist/ws/url.d.ts +3 -0
  460. package/dist/ws/url.js +44 -0
  461. package/dist/wsa/headers.d.ts +78 -0
  462. package/dist/wsa/headers.js +244 -0
  463. package/dist/wsa/model.d.ts +66 -0
  464. package/dist/wsa/model.js +52 -0
  465. package/dist/wsa/policy-detect.d.ts +81 -0
  466. package/dist/wsa/policy-detect.js +245 -0
  467. package/dist/wsdl/cache-naming.d.ts +39 -0
  468. package/dist/wsdl/cache-naming.js +90 -0
  469. package/dist/wsdl/cache.d.ts +48 -0
  470. package/dist/wsdl/cache.js +141 -0
  471. package/dist/wsdl/docs-generator.d.ts +47 -0
  472. package/dist/wsdl/docs-generator.js +439 -0
  473. package/dist/wsdl/dom-utils.d.ts +15 -0
  474. package/dist/wsdl/dom-utils.js +50 -0
  475. package/dist/wsdl/export-definition.d.ts +38 -0
  476. package/dist/wsdl/export-definition.js +100 -0
  477. package/dist/wsdl/fetch.d.ts +13 -0
  478. package/dist/wsdl/fetch.js +60 -0
  479. package/dist/wsdl/merge.d.ts +17 -0
  480. package/dist/wsdl/merge.js +57 -0
  481. package/dist/wsdl/model.d.ts +176 -0
  482. package/dist/wsdl/model.js +17 -0
  483. package/dist/wsdl/parse-binding.d.ts +6 -0
  484. package/dist/wsdl/parse-binding.js +150 -0
  485. package/dist/wsdl/parse-wsdl.d.ts +47 -0
  486. package/dist/wsdl/parse-wsdl.js +161 -0
  487. package/dist/wsdl/qname.d.ts +28 -0
  488. package/dist/wsdl/qname.js +41 -0
  489. package/dist/wsdl/ref-policy.d.ts +54 -0
  490. package/dist/wsdl/ref-policy.js +87 -0
  491. package/dist/wsdl/resolver.d.ts +81 -0
  492. package/dist/wsdl/resolver.js +276 -0
  493. package/dist/wsdl/update-definition.d.ts +106 -0
  494. package/dist/wsdl/update-definition.js +314 -0
  495. package/dist/wss/apply.d.ts +40 -0
  496. package/dist/wss/apply.js +212 -0
  497. package/dist/wss/c14n-prefixes.d.ts +27 -0
  498. package/dist/wss/c14n-prefixes.js +95 -0
  499. package/dist/wss/incoming/decrypt.d.ts +35 -0
  500. package/dist/wss/incoming/decrypt.js +57 -0
  501. package/dist/wss/incoming/index.d.ts +56 -0
  502. package/dist/wss/incoming/index.js +189 -0
  503. package/dist/wss/incoming/verify.d.ts +74 -0
  504. package/dist/wss/incoming/verify.js +440 -0
  505. package/dist/wss/key-identifiers.d.ts +76 -0
  506. package/dist/wss/key-identifiers.js +139 -0
  507. package/dist/wss/keystore/certificate.d.ts +45 -0
  508. package/dist/wss/keystore/certificate.js +134 -0
  509. package/dist/wss/keystore/index.d.ts +50 -0
  510. package/dist/wss/keystore/index.js +80 -0
  511. package/dist/wss/keystore/model.d.ts +83 -0
  512. package/dist/wss/keystore/model.js +27 -0
  513. package/dist/wss/keystore/pem.d.ts +21 -0
  514. package/dist/wss/keystore/pem.js +140 -0
  515. package/dist/wss/keystore/pkcs12.d.ts +21 -0
  516. package/dist/wss/keystore/pkcs12.js +125 -0
  517. package/dist/wss/model.d.ts +160 -0
  518. package/dist/wss/model.js +37 -0
  519. package/dist/wss/outgoing/encryption.d.ts +76 -0
  520. package/dist/wss/outgoing/encryption.js +618 -0
  521. package/dist/wss/outgoing/signature.d.ts +73 -0
  522. package/dist/wss/outgoing/signature.js +239 -0
  523. package/dist/wss/outgoing/timestamp.d.ts +29 -0
  524. package/dist/wss/outgoing/timestamp.js +39 -0
  525. package/dist/wss/outgoing/username-token.d.ts +36 -0
  526. package/dist/wss/outgoing/username-token.js +68 -0
  527. package/dist/wss/security-header.d.ts +31 -0
  528. package/dist/wss/security-header.js +83 -0
  529. package/dist/xml/index.d.ts +7 -0
  530. package/dist/xml/index.js +7 -0
  531. package/dist/xml/namespaces.d.ts +36 -0
  532. package/dist/xml/namespaces.js +60 -0
  533. package/dist/xml/parse.d.ts +79 -0
  534. package/dist/xml/parse.js +109 -0
  535. package/dist/xml/positions.d.ts +26 -0
  536. package/dist/xml/positions.js +71 -0
  537. package/dist/xml/pretty.d.ts +37 -0
  538. package/dist/xml/pretty.js +137 -0
  539. package/dist/xml/serialize.d.ts +6 -0
  540. package/dist/xml/serialize.js +8 -0
  541. package/dist/xml/tolerant-tree.d.ts +56 -0
  542. package/dist/xml/tolerant-tree.js +134 -0
  543. package/dist/xpath/evaluate-async.d.ts +31 -0
  544. package/dist/xpath/evaluate-async.js +81 -0
  545. package/dist/xpath/evaluate.d.ts +98 -0
  546. package/dist/xpath/evaluate.js +340 -0
  547. package/dist/xpath/jsonpath.d.ts +40 -0
  548. package/dist/xpath/jsonpath.js +109 -0
  549. package/dist/xpath/namespaces.d.ts +29 -0
  550. package/dist/xpath/namespaces.js +101 -0
  551. package/dist/xpath/worker.d.ts +7 -0
  552. package/dist/xpath/worker.js +26 -0
  553. package/dist/xsd/builtins.d.ts +36 -0
  554. package/dist/xsd/builtins.js +108 -0
  555. package/dist/xsd/check-references.d.ts +25 -0
  556. package/dist/xsd/check-references.js +145 -0
  557. package/dist/xsd/form-edits.d.ts +57 -0
  558. package/dist/xsd/form-edits.js +153 -0
  559. package/dist/xsd/form-model.d.ts +153 -0
  560. package/dist/xsd/form-model.js +691 -0
  561. package/dist/xsd/locate.d.ts +42 -0
  562. package/dist/xsd/locate.js +249 -0
  563. package/dist/xsd/model.d.ts +249 -0
  564. package/dist/xsd/model.js +1 -0
  565. package/dist/xsd/parse-particles.d.ts +48 -0
  566. package/dist/xsd/parse-particles.js +320 -0
  567. package/dist/xsd/parse-schema.d.ts +21 -0
  568. package/dist/xsd/parse-schema.js +143 -0
  569. package/dist/xsd/resolve-content.d.ts +18 -0
  570. package/dist/xsd/resolve-content.js +242 -0
  571. package/dist/xsd/sample-generator.d.ts +51 -0
  572. package/dist/xsd/sample-generator.js +291 -0
  573. package/dist/xsd/sample-types.d.ts +21 -0
  574. package/dist/xsd/sample-types.js +69 -0
  575. package/dist/xsd/sample-values.d.ts +54 -0
  576. package/dist/xsd/sample-values.js +267 -0
  577. package/dist/xsd/schema-set.d.ts +51 -0
  578. package/dist/xsd/schema-set.js +203 -0
  579. package/dist/xsd/xml-scan.d.ts +64 -0
  580. package/dist/xsd/xml-scan.js +286 -0
  581. package/dist/xsd/xml-writer.d.ts +56 -0
  582. package/dist/xsd/xml-writer.js +103 -0
  583. package/package.json +69 -0
@@ -0,0 +1,333 @@
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.
6
+ *
7
+ * Whatever the server does is a result. `done` never rejects: a refused handshake, a dropped
8
+ * socket and a clean close all resolve with the exchange that records them. A bad *option* is
9
+ * different — it never reaches the server, so it throws synchronously instead, and cleans up
10
+ * whatever it had already built (subscriptions, an owned dispatcher) before doing so.
11
+ */
12
+ import diagnosticsChannel from 'node:diagnostics_channel';
13
+ import { ProxyAgent, WebSocket } from 'undici';
14
+ import { WsError } from '../errors.js';
15
+ import { createDispatcher, proxyAgentOptionsFor } from '../http/client.js';
16
+ import { sslInfoForSocket } from '../http/tls.js';
17
+ 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
+ if (code !== 1000 && !(code >= 3000 && code <= 4999)) {
21
+ throw new WsError('ws-bad-close', `${code} is not a close code an application may send (1000, or 3000–4999)`, {
22
+ details: { code },
23
+ });
24
+ }
25
+ }
26
+ // undici's WebSocket API reports a plain refusal (e.g. a 401) and a completed-but-mismatched
27
+ // handshake (a 101 whose Sec-WebSocket-Protocol selects none of what we offered) identically: an
28
+ // empty `error.message`. So this default text names the offered subprotocols whenever there were
29
+ // any, since that ambiguous case is the one where the extra detail actually helps the reader. It
30
+ // is only ever used before a handshake has happened — see the `error` listener below.
31
+ function defaultHandshakeError(subprotocols) {
32
+ if (subprotocols !== undefined && subprotocols.length > 0) {
33
+ return `The server refused the WebSocket handshake, or selected none of the offered subprotocols (${subprotocols.join(', ')})`;
34
+ }
35
+ return 'The server refused the WebSocket handshake';
36
+ }
37
+ /** A message naming what was wrong with `options`, for the `ws-bad-options` error below. */
38
+ function describeBadOptions(options, err) {
39
+ const reason = err instanceof Error ? err.message : String(err);
40
+ return `The WebSocket options for "${options.url}" are invalid: ${reason}`;
41
+ }
42
+ /**
43
+ * True when `message` (an `undici:client:sendHeaders` payload) is this session's own WebSocket
44
+ * upgrade request. Matched by origin and path *and* required to carry `Sec-WebSocket-Key`
45
+ * (case-insensitively, in the raw head), so a concurrent plain HTTP request to the same URL —
46
+ * same origin, same path, no upgrade — can never donate its head or TLS info to this session.
47
+ *
48
+ * Exported only for its own unit test (ordering a diagnostics-channel race reliably isn't
49
+ * possible); not part of the package's public surface — `index.ts` does not re-export it.
50
+ */
51
+ export function isUpgradeHeadFor(message, httpOrigin, pathAndSearch) {
52
+ const m = message;
53
+ if (typeof m.headers !== 'string')
54
+ return false;
55
+ const origin = typeof m.request?.origin === 'string'
56
+ ? m.request.origin
57
+ : m.request?.origin instanceof URL
58
+ ? m.request.origin.origin
59
+ : undefined;
60
+ if (origin !== httpOrigin || m.request?.path !== pathAndSearch)
61
+ return false;
62
+ return /sec-websocket-key/i.test(m.headers);
63
+ }
64
+ export function openWsSession(options, hooks = {}) {
65
+ const startedMs = performance.now();
66
+ const startedAt = new Date().toISOString();
67
+ const timeoutMs = options.handshakeTimeoutMs ?? DEFAULT_HANDSHAKE_TIMEOUT_MS;
68
+ // Parsed before anything is built: a bad URL means there is nothing yet to clean up.
69
+ let target;
70
+ try {
71
+ target = new URL(options.url);
72
+ }
73
+ catch (err) {
74
+ throw new WsError('ws-bad-options', `"${options.url}" is not a valid URL`, {
75
+ cause: err,
76
+ details: { url: options.url },
77
+ });
78
+ }
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;
85
+ const httpOrigin = `${target.protocol === 'wss:' ? 'https:' : 'http:'}//${target.host}`;
86
+ const frames = [];
87
+ const counts = { sent: 0, received: 0, bytesSent: 0, bytesReceived: 0 };
88
+ let handshake;
89
+ let rawRequestHead;
90
+ let tls;
91
+ let closedBy;
92
+ let failure;
93
+ let settled = false;
94
+ const record = (direction, opcode, payload, close) => {
95
+ const bytes = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : Buffer.from(payload);
96
+ const binaryish = opcode === 'binary' || ((opcode === 'ping' || opcode === 'pong') && bytes.length > 0);
97
+ const frame = {
98
+ index: frames.length,
99
+ direction,
100
+ opcode,
101
+ at: Math.round(performance.now() - startedMs),
102
+ size: bytes.length,
103
+ ...(opcode === 'text' ? { text: bytes.toString('utf8') } : {}),
104
+ ...(binaryish ? { base64: bytes.toString('base64') } : {}),
105
+ ...(close !== undefined ? { close } : {}),
106
+ };
107
+ frames.push(frame);
108
+ if (opcode === 'text' || opcode === 'binary') {
109
+ if (direction === 'sent') {
110
+ counts.sent += 1;
111
+ counts.bytesSent += bytes.length;
112
+ }
113
+ else {
114
+ counts.received += 1;
115
+ counts.bytesReceived += bytes.length;
116
+ }
117
+ }
118
+ hooks.onFrame?.(frame);
119
+ return frame;
120
+ };
121
+ const buildHandshake = (extra) => ({
122
+ url: options.url,
123
+ requestHeaders: { ...(options.headers ?? {}) },
124
+ requestedSubprotocols: [...(options.subprotocols ?? [])],
125
+ ...(rawRequestHead !== undefined ? { rawRequestHead } : {}),
126
+ startedAt,
127
+ durationMs: Math.round(performance.now() - startedMs),
128
+ ...(tls !== undefined ? { tls } : {}),
129
+ // The filter drops every `undefined`/empty-string entry at runtime, which is what makes this
130
+ // safe under `exactOptionalPropertyTypes`; the cast says so, since `Object.fromEntries` can't
131
+ // carry that through its own type.
132
+ ...Object.fromEntries(Object.entries(extra).filter(([, v]) => v !== undefined && v !== '')),
133
+ });
134
+ // Subscribed before the socket exists: undici starts the handshake inside the constructor.
135
+ // The request head and the TLS session come from the channel `TimingTracker` reads.
136
+ const onSendHeaders = (message) => {
137
+ if (rawRequestHead !== undefined)
138
+ return;
139
+ if (!isUpgradeHeadFor(message, httpOrigin, `${target.pathname}${target.search}`))
140
+ return;
141
+ rawRequestHead = message.headers;
142
+ if (message.socket?.encrypted === true)
143
+ tls = sslInfoForSocket(message.socket);
144
+ };
145
+ // Subscribed (and `socket` declared) before `new WebSocket(...)` runs: if a diagnostics channel
146
+ // ever delivered its payload before the assignment below completed, this ordering is what keeps
147
+ // the `m.websocket !== socket` identity checks below safe rather than comparing against `undefined`.
148
+ // `let`, not `const`: it is assigned exactly once, below (inside the try block that builds the
149
+ // socket), but declared here so those handlers' identity comparisons stay safe even if a
150
+ // diagnostics channel delivered its payload early.
151
+ let socket;
152
+ const onOpenChannel = (message) => {
153
+ const m = message;
154
+ if (m.websocket !== socket)
155
+ return;
156
+ handshake = buildHandshake({
157
+ status: m.handshakeResponse?.status,
158
+ statusText: m.handshakeResponse?.statusText,
159
+ responseHeaders: m.handshakeResponse?.headers,
160
+ protocol: m.protocol,
161
+ extensions: m.extensions,
162
+ remoteAddress: m.address?.address !== undefined ? `${m.address.address}:${m.address.port ?? ''}` : undefined,
163
+ });
164
+ // The handshake succeeded: there is no longer a timeout to guard against.
165
+ clearTimeout(timer);
166
+ hooks.onHandshake?.(handshake);
167
+ };
168
+ const onPing = (message) => {
169
+ const m = message;
170
+ if (m.websocket !== socket)
171
+ return;
172
+ const payload = m.payload ?? new Uint8Array();
173
+ record('received', 'ping', payload);
174
+ record('sent', 'pong', payload); // undici answers a ping itself, with the same payload
175
+ };
176
+ const onPong = (message) => {
177
+ const m = message;
178
+ if (m.websocket === socket)
179
+ record('received', 'pong', m.payload ?? new Uint8Array());
180
+ };
181
+ const unsubscribeAll = () => {
182
+ diagnosticsChannel.unsubscribe('undici:client:sendHeaders', onSendHeaders);
183
+ diagnosticsChannel.unsubscribe('undici:websocket:open', onOpenChannel);
184
+ diagnosticsChannel.unsubscribe('undici:websocket:ping', onPing);
185
+ diagnosticsChannel.unsubscribe('undici:websocket:pong', onPong);
186
+ };
187
+ // Everything that can throw synchronously for a bad *option* (a malformed proxy target, a
188
+ // subprotocol list the WHATWG API itself rejects — a duplicate entry or one with whitespace)
189
+ // happens in here, so a throw can unwind cleanly: unsubscribe whatever got subscribed, close an
190
+ // owned dispatcher if one got built, then report `ws-bad-options` instead of leaking either.
191
+ let dispatcher;
192
+ 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
+ });
203
+ diagnosticsChannel.subscribe('undici:client:sendHeaders', onSendHeaders);
204
+ diagnosticsChannel.subscribe('undici:websocket:open', onOpenChannel);
205
+ diagnosticsChannel.subscribe('undici:websocket:ping', onPing);
206
+ diagnosticsChannel.subscribe('undici:websocket:pong', onPong);
207
+ socket = new WebSocket(options.url, {
208
+ dispatcher,
209
+ ...(options.headers !== undefined ? { headers: { ...options.headers } } : {}),
210
+ ...(options.subprotocols !== undefined && options.subprotocols.length > 0
211
+ ? { protocols: [...options.subprotocols] }
212
+ : {}),
213
+ });
214
+ }
215
+ catch (err) {
216
+ unsubscribeAll();
217
+ if (ownsDispatcher)
218
+ void dispatcher?.close().catch(() => undefined);
219
+ throw new WsError('ws-bad-options', describeBadOptions(options, err), {
220
+ cause: err,
221
+ details: {
222
+ url: options.url,
223
+ ...(options.subprotocols !== undefined ? { subprotocols: options.subprotocols } : {}),
224
+ },
225
+ });
226
+ }
227
+ socket.binaryType = 'arraybuffer';
228
+ const ws = socket;
229
+ let resolveDone;
230
+ const done = new Promise((resolve) => {
231
+ resolveDone = resolve;
232
+ });
233
+ /** Settles the session exactly once, from whichever path gets there first. */
234
+ const settle = (code, reason, wasClean) => {
235
+ if (settled)
236
+ return;
237
+ settled = true;
238
+ clearTimeout(timer);
239
+ options.signal?.removeEventListener('abort', onAbort);
240
+ unsubscribeAll();
241
+ const clean = wasClean && handshake !== undefined;
242
+ const by = closedBy ?? (clean ? 'server' : 'error');
243
+ if (clean)
244
+ record('received', 'close', reason, { code, reason });
245
+ // A handshake that already succeeded keeps no `error` on it, ever: the handshake is not what
246
+ // failed. A later break in the connection (a drop, a timeout that can't happen post-handshake,
247
+ // an abort) is expressed entirely by `closed: { by: 'error', ... }` below.
248
+ const settledHandshake = handshake ?? buildHandshake({ error: failure ?? defaultHandshakeError(options.subprotocols) });
249
+ const exchange = {
250
+ kind: 'websocket',
251
+ url: options.url,
252
+ handshake: settledHandshake,
253
+ frames,
254
+ closed: { code, reason, by },
255
+ counts: { ...counts },
256
+ durationMs: Math.round(performance.now() - startedMs),
257
+ };
258
+ // A failed close of an already-finished session tells the caller nothing useful — the
259
+ // exchange is done either way — so it is swallowed rather than surfaced.
260
+ if (ownsDispatcher)
261
+ void dispatcher?.close().catch(() => undefined);
262
+ hooks.onClosed?.(exchange);
263
+ resolveDone(exchange);
264
+ };
265
+ /** Ends a session the server never ended: a timeout, or an abort. */
266
+ const fail = (message) => {
267
+ failure ??= message;
268
+ closedBy ??= 'error';
269
+ // There is no abort for a connecting socket; close() on one fails the handshake, which is the point.
270
+ ws.close();
271
+ };
272
+ const timer = setTimeout(() => {
273
+ if (handshake === undefined)
274
+ fail(`The server did not answer the handshake within ${timeoutMs} ms`);
275
+ }, timeoutMs);
276
+ const onAbort = () => fail('The connection was cancelled');
277
+ if (options.signal?.aborted === true)
278
+ queueMicrotask(onAbort);
279
+ options.signal?.addEventListener('abort', onAbort, { once: true });
280
+ ws.addEventListener('message', (event) => {
281
+ const data = event.data;
282
+ const frame = typeof data === 'string' ? record('received', 'text', data) : record('received', 'binary', new Uint8Array(data));
283
+ if (options.maxMessageBytes !== undefined && frame.size > options.maxMessageBytes && closedBy === undefined) {
284
+ // 1009 is the code for this, and an application may not send it; 1000 with the reason is what it can say.
285
+ closedBy = 'client';
286
+ record('sent', 'close', 'message too big', { code: 1000, reason: 'message too big' });
287
+ ws.close(1000, 'message too big');
288
+ }
289
+ });
290
+ ws.addEventListener('error', (event) => {
291
+ const eventMessage = event.message;
292
+ const message = typeof eventMessage === 'string' ? eventMessage : '';
293
+ if (handshake === undefined) {
294
+ // Nothing has succeeded yet: this is a refusal (or an undici-internal empty-message variant
295
+ // of one — see `defaultHandshakeError`). A refused handshake may never fire `close` when the
296
+ // origin's connection is pooled, so `error` alone is authoritative for it. Settle on the next
297
+ // macrotask so a `close` that does arrive (as it does when this is the first connection to
298
+ // the origin) wins and carries its own code.
299
+ failure ??= message || defaultHandshakeError(options.subprotocols);
300
+ setTimeout(() => settle(1006, '', false), 0);
301
+ }
302
+ else {
303
+ // The handshake already succeeded; this describes the connection breaking afterward (e.g.
304
+ // the socket was dropped), not a refusal — it must never land in `handshake.error`. `settle`
305
+ // reports it via `closed: { by: 'error', ... }` instead.
306
+ failure ??= message || 'The connection was lost';
307
+ }
308
+ });
309
+ ws.addEventListener('close', (event) => {
310
+ settle(event.code, event.reason, event.wasClean);
311
+ });
312
+ return {
313
+ get isOpen() {
314
+ return ws.readyState === WebSocket.OPEN;
315
+ },
316
+ done,
317
+ send(data) {
318
+ if (ws.readyState !== WebSocket.OPEN)
319
+ throw new WsError('ws-session-closed', 'The connection is closed');
320
+ ws.send(data);
321
+ return record('sent', typeof data === 'string' ? 'text' : 'binary', data);
322
+ },
323
+ close(code = 1000, reason = '') {
324
+ if (ws.readyState === WebSocket.CLOSING || ws.readyState === WebSocket.CLOSED)
325
+ return;
326
+ assertCloseCode(code);
327
+ closedBy ??= 'client';
328
+ if (ws.readyState === WebSocket.OPEN)
329
+ record('sent', 'close', reason, { code, reason });
330
+ ws.close(code, reason);
331
+ },
332
+ };
333
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The pure tree and naming rules of a WebSocket API: walking its folders, and naming a saved
3
+ * message's file.
4
+ *
5
+ * A leaf on purpose. `model.ts` needs `project/paths.js` for its slugs, and that reaches
6
+ * `node:path`, which a renderer bundle cannot have — so the handful of rules the editor also needs
7
+ * live here, with no runtime imports but `pretty.ts` (itself browser-safe), and `model.ts`
8
+ * re-exports them so nothing else moved.
9
+ */
10
+ import type { WsApi, WsFolder, WsRequestDef, WsSavedMessage } from './model.js';
11
+ /** Every request in `folder` and, depth-first, in the folders below it. */
12
+ export declare function wsFolderRequests(folder: Pick<WsFolder, 'folders' | 'requests'>): WsRequestDef[];
13
+ /** Every request in `api`, its root requests first and then each folder depth-first. */
14
+ export declare function wsApiRequests(api: WsApi): WsRequestDef[];
15
+ /** Every folder in `api`, depth-first. */
16
+ export declare function wsApiFolders(api: WsApi): WsFolder[];
17
+ /** The file name a saved message is stored under, named by what it holds. */
18
+ export declare function wsMessageFileName(requestSlug: string, message: Pick<WsSavedMessage, 'slug' | 'format' | 'content'>): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The pure tree and naming rules of a WebSocket API: walking its folders, and naming a saved
3
+ * message's file.
4
+ *
5
+ * A leaf on purpose. `model.ts` needs `project/paths.js` for its slugs, and that reaches
6
+ * `node:path`, which a renderer bundle cannot have — so the handful of rules the editor also needs
7
+ * live here, with no runtime imports but `pretty.ts` (itself browser-safe), and `model.ts`
8
+ * re-exports them so nothing else moved.
9
+ */
10
+ import { prettyFrameText } from './pretty.js';
11
+ /** Every request in `folder` and, depth-first, in the folders below it. */
12
+ export function wsFolderRequests(folder) {
13
+ return [...folder.requests, ...folder.folders.flatMap((child) => wsFolderRequests(child))];
14
+ }
15
+ /** Every request in `api`, its root requests first and then each folder depth-first. */
16
+ export function wsApiRequests(api) {
17
+ return wsFolderRequests(api);
18
+ }
19
+ /** Every folder in `api`, depth-first. */
20
+ export function wsApiFolders(api) {
21
+ const walk = (folders) => folders.flatMap((folder) => [folder, ...walk(folder.folders)]);
22
+ return walk(api.folders);
23
+ }
24
+ /** The file name a saved message is stored under, named by what it holds. */
25
+ export function wsMessageFileName(requestSlug, message) {
26
+ const language = message.format === 'binary' ? 'b64' : prettyFrameText(message.content).language;
27
+ return `${requestSlug}.msg-${message.slug}.${language === 'text' ? 'txt' : language}`;
28
+ }
@@ -0,0 +1,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 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;
9
+ export interface WsTranscript {
10
+ readonly frames: readonly WsFrame[];
11
+ readonly truncated: boolean;
12
+ readonly omittedFrames: number;
13
+ }
14
+ export declare function capFrames(frames: readonly WsFrame[]): WsTranscript;
@@ -0,0 +1,29 @@
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
+ }
15
+ if (frame.text === undefined && frame.base64 === undefined)
16
+ return frame;
17
+ stripped = true;
18
+ return {
19
+ index: frame.index,
20
+ direction: frame.direction,
21
+ opcode: frame.opcode,
22
+ at: frame.at,
23
+ size: frame.size,
24
+ ...(frame.close !== undefined ? { close: frame.close } : {}),
25
+ payloadTruncated: true,
26
+ };
27
+ });
28
+ return { frames: capped, truncated: omittedFrames > 0 || stripped, omittedFrames };
29
+ }
@@ -0,0 +1,3 @@
1
+ import type { KeyValueEntry } from '../rest/model.js';
2
+ /** The URL a session dials: the request's own when absolute, else its path under the server URL. */
3
+ export declare function resolveWsUrl(serverUrl: string, requestUrl: string, query: readonly KeyValueEntry[]): string;
package/dist/ws/url.js ADDED
@@ -0,0 +1,44 @@
1
+ import { WsError } from '../errors.js';
2
+ const SCHEME = { 'ws:': 'ws:', 'wss:': 'wss:', 'http:': 'ws:', 'https:': 'wss:' };
3
+ // Trimmed by hand rather than by regex: `/\/+$/` has to retry from every position in a string of
4
+ // many slashes, which costs time in the square of its length.
5
+ function trimTrailingSlashes(text) {
6
+ let end = text.length;
7
+ while (end > 0 && text[end - 1] === '/')
8
+ end -= 1;
9
+ return text.slice(0, end);
10
+ }
11
+ function trimLeadingSlashes(text) {
12
+ let start = 0;
13
+ while (start < text.length && text[start] === '/')
14
+ start += 1;
15
+ return text.slice(start);
16
+ }
17
+ /** The URL a session dials: the request's own when absolute, else its path under the server URL. */
18
+ export function resolveWsUrl(serverUrl, requestUrl, query) {
19
+ const absolute = /^[a-z][a-z0-9+.-]*:\/\//i.test(requestUrl);
20
+ const joined = absolute
21
+ ? requestUrl
22
+ : requestUrl === ''
23
+ ? serverUrl
24
+ : `${trimTrailingSlashes(serverUrl)}/${trimLeadingSlashes(requestUrl)}`;
25
+ let url;
26
+ try {
27
+ url = new URL(joined);
28
+ }
29
+ catch {
30
+ throw new WsError('ws-bad-url', `"${joined}" is not a URL`, { details: { url: joined } });
31
+ }
32
+ const scheme = SCHEME[url.protocol];
33
+ if (scheme === undefined) {
34
+ throw new WsError('ws-bad-url', `A WebSocket URL starts with ws:// or wss://, not ${url.protocol}//`, {
35
+ details: { url: joined },
36
+ });
37
+ }
38
+ url.protocol = scheme;
39
+ for (const row of query) {
40
+ if (row.enabled && row.name !== '')
41
+ url.searchParams.append(row.name, row.value);
42
+ }
43
+ return url.toString();
44
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Builds, applies and strips the WS-Addressing header block of an outgoing SOAP envelope,
3
+ * for both the 2005/08 (W3C Recommendation) and the 2004/08 (Member Submission) versions.
4
+ *
5
+ * Header construction is deterministic: every non-deterministic input — the MessageID's UUID —
6
+ * is injected, so a golden test can pin the exact bytes.
7
+ */
8
+ import type { Element } from '@xmldom/xmldom';
9
+ import type { SoapEnvelopeVersion } from '../soap/envelope.js';
10
+ import type { WsaConfig, WsaVersion } from './model.js';
11
+ /** The prefix every generated WS-Addressing header binds its namespace to. */
12
+ export declare const WSA_PREFIX = "wsa";
13
+ /** The addressing namespace URI for `version`. */
14
+ export declare function wsaNamespace(version: WsaVersion): string;
15
+ /** The "anonymous" endpoint-reference address for `version`. */
16
+ export declare function anonymousAddress(version: WsaVersion): string;
17
+ /** The default `RelationshipType` of a `wsa:RelatesTo` for `version`. */
18
+ export declare function defaultRelationshipType(version: WsaVersion): string;
19
+ /** Everything a header block needs that the configuration itself does not carry. */
20
+ export interface WsaHeaderContext {
21
+ /** The URL the request is about to be sent to; the default `wsa:To`. */
22
+ readonly endpoint: string;
23
+ /** The request's SOAPAction, used as the `wsa:Action` when the configuration names none. */
24
+ readonly soapAction?: string;
25
+ /** The WSDL-derived default action, used when neither the configuration nor SOAPAction says. */
26
+ readonly defaultAction: string;
27
+ /** Mints the MessageID's UUID; injected so golden tests are deterministic. */
28
+ readonly uuid: () => string;
29
+ readonly envelopeVersion: SoapEnvelopeVersion;
30
+ /**
31
+ * The prefix the target envelope binds its SOAP namespace to, used for the `mustUnderstand`
32
+ * attribute so it matches the envelope being addressed (`soap:mustUnderstand` for an envelope
33
+ * that uses `soap:`, not always `soapenv:`). Defaults to `soapenv`, the common case, when a
34
+ * caller builds headers without a real envelope in hand (e.g. a preview).
35
+ */
36
+ readonly envelopePrefix?: string;
37
+ }
38
+ /** The `wsa:Action` a send will carry, or `undefined` when it carries none. */
39
+ export declare function effectiveAction(config: WsaConfig, ctx: Pick<WsaHeaderContext, 'soapAction' | 'defaultAction'>): string | undefined;
40
+ /** The `wsa:To` a send will carry, or `undefined` when it carries none. */
41
+ export declare function effectiveTo(config: WsaConfig, endpoint: string): string | undefined;
42
+ /** The `wsa:MessageID` a send will carry, or `undefined` when it carries none. */
43
+ export declare function effectiveMessageId(config: WsaConfig, uuid: () => string): string | undefined;
44
+ /**
45
+ * Builds the `wsa:*` header elements for `config`, in WS-Addressing's own order:
46
+ * `Action`, `To`, `MessageID`, `ReplyTo`, `From`, `FaultTo`, `RelatesTo`.
47
+ *
48
+ * The elements belong to a scratch document; a caller inserting them into an envelope must
49
+ * `importNode` them first (as {@link applyWsaHeaders} does).
50
+ *
51
+ * @param config the effective configuration for this send
52
+ * @param ctx the endpoint, SOAPAction, WSDL default action, UUID source and SOAP version
53
+ * @returns the header elements, empty when the configuration produces none
54
+ */
55
+ export declare function buildWsaHeaders(config: WsaConfig, ctx: WsaHeaderContext): readonly Element[];
56
+ /**
57
+ * Writes `config`'s WS-Addressing headers into `envelopeXml`.
58
+ *
59
+ * Any `wsa:*` header already present — of *either* version — is removed first, so applying
60
+ * twice (or switching version) never leaves two contradicting `wsa:Action`s behind. The new
61
+ * block is inserted before every other header, which is where a reader looks for it.
62
+ *
63
+ * @param envelopeXml the envelope to address
64
+ * @param config the effective configuration for this send
65
+ * @param ctx the endpoint, SOAPAction, default action, UUID source and SOAP version
66
+ * @returns the serialized, addressed envelope
67
+ * @throws WirebenchError `wsa-not-an-envelope` when `envelopeXml` is not a SOAP envelope
68
+ */
69
+ export declare function applyWsaHeaders(envelopeXml: string, config: WsaConfig, ctx: WsaHeaderContext): string;
70
+ /**
71
+ * Removes every WS-Addressing header (either version) from `envelopeXml`.
72
+ *
73
+ * A document that is not a SOAP envelope — or that carries no addressing at all — is returned
74
+ * byte for byte, so "Remove" on an untouched envelope is a genuine no-op.
75
+ *
76
+ * @param envelopeXml the envelope to clean
77
+ */
78
+ export declare function stripWsaHeaders(envelopeXml: string): string;