@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,73 @@
1
+ /**
2
+ * XML Signature for an outgoing WS-Security header, on top of `xml-crypto`'s `SignedXml`.
3
+ *
4
+ * `xml-crypto` only speaks serialized XML: it parses the string it is given, adds the
5
+ * `<ds:Signature>` and hands back a new string. {@link signEnvelope} therefore serializes the
6
+ * document it is given, signs, re-parses and swaps the result into the *same* `Document`
7
+ * object — so the caller's reference stays valid, at the cost of every `Element` it held
8
+ * before the call becoming stale. `applyOutgoingWss` re-resolves the `wsse:Security` block
9
+ * after each signature entry for exactly that reason.
10
+ */
11
+ import type { Document } from '@xmldom/xmldom';
12
+ import type { Keystore, KeystoreAlias } from '../keystore/model.js';
13
+ import type { WssContext, WssSignatureEntry } from '../model.js';
14
+ /** The keystore material {@link signEnvelope} signs with, resolved by the caller. */
15
+ export interface ResolvedSigningKey {
16
+ readonly keystore: Keystore;
17
+ readonly alias: KeystoreAlias;
18
+ /** The actor/role of the `wsse:Security` block the signature belongs in. */
19
+ readonly actor?: string;
20
+ }
21
+ /** The outcome of {@link verifySignature}. */
22
+ export interface VerifySignatureResult {
23
+ readonly ok: boolean;
24
+ /** The `URI`s the signature's references pointed at, without their leading `#`. */
25
+ readonly references: readonly string[];
26
+ /** Why verification failed; absent when `ok`. */
27
+ readonly error?: string;
28
+ }
29
+ /** What {@link verifySignature} needs to check a signature. */
30
+ export interface VerifySignatureOptions {
31
+ /** The signer's certificate, PEM encoded. */
32
+ readonly certPem: string;
33
+ /**
34
+ * Which `ds:Signature` to verify, when `xml` carries more than one. `index` counts among every
35
+ * `ds:Signature` element in the document, in document order (depth-first, pre-order) — the
36
+ * same order {@link findAllSignatures} and `verifyIncoming`'s own signature list use, so the
37
+ * two never disagree about which signature `index` names. Defaults to `0` (the first).
38
+ *
39
+ * Selecting by index against the *unmodified* document — rather than stripping every other
40
+ * `ds:Signature` before verifying — matters because a genuine signature's own references can
41
+ * cover the `wsse:Security` header (an enveloped-signature transform over a header that holds
42
+ * a second signature): removing that second signature before verification would change the
43
+ * bytes the first signature's digest was computed over, and it would fail.
44
+ */
45
+ readonly signature?: {
46
+ readonly index: number;
47
+ };
48
+ }
49
+ /**
50
+ * Signs the parts `entry` names and appends the `<ds:Signature>` to the `wsse:Security` block
51
+ * addressed to `resolved.actor`, mutating `doc` in place.
52
+ *
53
+ * Every referenced part is given a `wsu:Id="Id-<uuid>"` first (existing ids are kept), so the
54
+ * references are stable and `xml-crypto` never has to invent one.
55
+ *
56
+ * @param doc the envelope, already carrying its `wsse:Security` header
57
+ * @param entry the signature configuration
58
+ * @param resolved the keystore alias to sign with, and the Security block's actor
59
+ * @param ctx the injected secret/uuid capabilities
60
+ * @throws WssError `wss-not-an-envelope`, `wss-part-missing`, `wss-ski-missing`, `wss-signing-key-missing`
61
+ */
62
+ export declare function signEnvelope(doc: Document, entry: WssSignatureEntry, resolved: ResolvedSigningKey, ctx: WssContext): Promise<void>;
63
+ /**
64
+ * Verifies the `ds:Signature` in `xml` against `certPem`.
65
+ *
66
+ * The certificate is supplied by the caller rather than taken from the document's own
67
+ * `KeyInfo`: a signature is only meaningful against a key you already trust.
68
+ *
69
+ * @param xml the signed envelope
70
+ * @param options the certificate to verify against
71
+ * @returns whether the signature held, and which references it covered
72
+ */
73
+ export declare function verifySignature(xml: string, options: VerifySignatureOptions): VerifySignatureResult;
@@ -0,0 +1,239 @@
1
+ /**
2
+ * XML Signature for an outgoing WS-Security header, on top of `xml-crypto`'s `SignedXml`.
3
+ *
4
+ * `xml-crypto` only speaks serialized XML: it parses the string it is given, adds the
5
+ * `<ds:Signature>` and hands back a new string. {@link signEnvelope} therefore serializes the
6
+ * document it is given, signs, re-parses and swaps the result into the *same* `Document`
7
+ * object — so the caller's reference stays valid, at the cost of every `Element` it held
8
+ * before the call becoming stale. `applyOutgoingWss` re-resolves the `wsse:Security` block
9
+ * after each signature entry for exactly that reason.
10
+ */
11
+ import { createPrivateKey } from 'node:crypto';
12
+ import { SignedXml } from 'xml-crypto';
13
+ import { WssError } from '../../errors.js';
14
+ import { NS } from '../../xml/namespaces.js';
15
+ import { parseXml } from '../../xml/parse.js';
16
+ import { serializeXml } from '../../xml/serialize.js';
17
+ import { detectEnvelopeVersion, envelopeNamespace } from '../../soap/envelope.js';
18
+ import { buildKeyIdentifier } from '../key-identifiers.js';
19
+ import { inclusiveNamespacePrefixList } from '../c14n-prefixes.js';
20
+ import { childElement, findElement, securityIndex } from '../security-header.js';
21
+ /** Exclusive XML canonicalization, the only form this build emits. */
22
+ const EXC_C14N = 'http://www.w3.org/2001/10/xml-exc-c14n#';
23
+ /** `SignatureMethod` URIs, by the entry's `signatureAlgorithm`. */
24
+ const SIGNATURE_ALGORITHM_URIS = {
25
+ 'rsa-sha256': 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
26
+ 'rsa-sha1': 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
27
+ };
28
+ /** `DigestMethod` URIs, by the entry's `digestAlgorithm`. */
29
+ const DIGEST_ALGORITHM_URIS = {
30
+ sha256: 'http://www.w3.org/2001/04/xmlenc#sha256',
31
+ sha1: 'http://www.w3.org/2000/09/xmldsig#sha1',
32
+ };
33
+ /** True when `element` already carries a `wsu:Id`. */
34
+ function existingWsuId(element) {
35
+ const value = element.getAttributeNS(NS.WSU, 'Id');
36
+ return value === null || value === '' ? undefined : value;
37
+ }
38
+ /**
39
+ * The element a part names. The two SOAP envelope namespaces are treated as one so the default
40
+ * parts (which store the SOAP 1.1 namespace for `Body`) also match a SOAP 1.2 envelope.
41
+ */
42
+ function resolvePart(root, part, envelopeNs) {
43
+ const namespace = part.namespace === NS.SOAP11_ENV || part.namespace === NS.SOAP12_ENV ? envelopeNs : part.namespace;
44
+ return findElement(root, namespace, part.name);
45
+ }
46
+ /** The private key of `alias`, decrypted with `passphrase` when its PEM needs one. */
47
+ function privateKeyOf(alias, passphrase) {
48
+ const keyPem = alias.keyPem;
49
+ if (keyPem === undefined || keyPem === '') {
50
+ throw new WssError('wss-signing-key-missing', `Keystore alias "${alias.alias}" has no private key to sign with.`);
51
+ }
52
+ try {
53
+ return createPrivateKey(keyPem);
54
+ }
55
+ catch (cause) {
56
+ if (passphrase === undefined) {
57
+ throw new WssError('wss-signing-key-missing', 'The signing key could not be read.', { cause });
58
+ }
59
+ try {
60
+ return createPrivateKey({ key: keyPem, passphrase });
61
+ }
62
+ catch (innerCause) {
63
+ throw new WssError('wss-signing-key-missing', 'The signing key could not be decrypted.', { cause: innerCause });
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Signs the parts `entry` names and appends the `<ds:Signature>` to the `wsse:Security` block
69
+ * addressed to `resolved.actor`, mutating `doc` in place.
70
+ *
71
+ * Every referenced part is given a `wsu:Id="Id-<uuid>"` first (existing ids are kept), so the
72
+ * references are stable and `xml-crypto` never has to invent one.
73
+ *
74
+ * @param doc the envelope, already carrying its `wsse:Security` header
75
+ * @param entry the signature configuration
76
+ * @param resolved the keystore alias to sign with, and the Security block's actor
77
+ * @param ctx the injected secret/uuid capabilities
78
+ * @throws WssError `wss-not-an-envelope`, `wss-part-missing`, `wss-ski-missing`, `wss-signing-key-missing`
79
+ */
80
+ export async function signEnvelope(doc, entry, resolved, ctx) {
81
+ const root = doc.documentElement;
82
+ const version = detectEnvelopeVersion(doc);
83
+ if (root === null || version === undefined) {
84
+ throw new WssError('wss-not-an-envelope', 'WS-Security can only be applied to a SOAP envelope.');
85
+ }
86
+ const envelopeNs = envelopeNamespace(version);
87
+ const header = childElement(root, envelopeNs, 'Header');
88
+ const security = header === undefined ? undefined : findElement(header, NS.WSSE, 'Security');
89
+ if (header === undefined || security === undefined) {
90
+ throw new WssError('wss-not-an-envelope', 'The envelope has no wsse:Security header to sign into.');
91
+ }
92
+ const references = [];
93
+ for (const part of entry.parts) {
94
+ const element = resolvePart(root, part, envelopeNs);
95
+ if (element === undefined) {
96
+ throw new WssError('wss-part-missing', `The message has no "${part.name}" element to sign.`, {
97
+ details: { name: part.name, namespace: part.namespace },
98
+ });
99
+ }
100
+ let id = existingWsuId(element);
101
+ if (id === undefined) {
102
+ id = `Id-${ctx.uuid()}`;
103
+ // Only declare `xmlns:wsu` here when no ancestor already binds the prefix to the WS-Utility
104
+ // namespace (the `wsse:Security` block does, for every part it added itself) — redeclaring
105
+ // it lower down is harmless to a parser but noise `verifySignature`/`xmlsec1` never asked for.
106
+ if (element.lookupNamespaceURI('wsu') !== NS.WSU) {
107
+ element.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:wsu', NS.WSU);
108
+ }
109
+ element.setAttributeNS(NS.WSU, 'wsu:Id', id);
110
+ }
111
+ references.push({ id, element });
112
+ }
113
+ const keyIdentifier = buildKeyIdentifier(entry.keyIdentifierType, {
114
+ certPem: resolved.alias.certPem,
115
+ chainPem: resolved.alias.chainPem,
116
+ useSingleCertificate: entry.useSingleCertificate,
117
+ tokenId: `X509-${ctx.uuid()}`,
118
+ });
119
+ if (keyIdentifier.binarySecurityTokenXml !== undefined) {
120
+ const token = parseXml(keyIdentifier.binarySecurityTokenXml, { location: 'envelope' }).documentElement;
121
+ if (token !== null) {
122
+ security.appendChild(doc.importNode(token, true));
123
+ }
124
+ }
125
+ const passphrase = entry.keyPasswordRef === undefined ? undefined : await ctx.secrets(entry.keyPasswordRef);
126
+ // The envelope's own prefix, needed on the SignedInfo canonicalization itself and on every
127
+ // reference transform: exclusive c14n only renders a namespace declaration a part visibly
128
+ // uses on an element/attribute *name*, so a receiver that canonicalizes a reference on its
129
+ // own (rather than trusting this build's canonical form) needs it spelled out.
130
+ const envPrefix = root.prefix;
131
+ const signer = new SignedXml({
132
+ idMode: 'wssecurity',
133
+ privateKey: privateKeyOf(resolved.alias, passphrase),
134
+ publicCert: resolved.alias.certPem,
135
+ canonicalizationAlgorithm: EXC_C14N,
136
+ inclusiveNamespacesPrefixList: envPrefix !== null && envPrefix !== '' ? [envPrefix] : [],
137
+ signatureAlgorithm: SIGNATURE_ALGORITHM_URIS[entry.signatureAlgorithm],
138
+ getKeyInfoContent: () => keyIdentifier.keyInfoXml,
139
+ });
140
+ for (const { id, element } of references) {
141
+ signer.addReference({
142
+ // By id rather than by element name: the id is unique, so this selects exactly the one
143
+ // element even when the envelope carries two parts with the same local name.
144
+ xpath: `//*[@*[local-name(.)='Id']='${id}']`,
145
+ transforms: [EXC_C14N],
146
+ digestAlgorithm: DIGEST_ALGORITHM_URIS[entry.digestAlgorithm],
147
+ inclusiveNamespacesPrefixList: inclusiveNamespacePrefixList(element, envPrefix),
148
+ });
149
+ }
150
+ // The index and the XPath must count the same node set — direct `wsse:Security` children of
151
+ // the header — so a `wsse:Security` nested elsewhere (inside the Body, say) never shifts
152
+ // which block xml-crypto appends the signature into. `securityIndex` throws when no direct
153
+ // child matches, so `index` is never used to build an XPath that resolves to nothing.
154
+ const index = securityIndex(header, version, resolved.actor);
155
+ signer.computeSignature(serializeXml(doc), {
156
+ prefix: 'ds',
157
+ location: {
158
+ reference: `/*[local-name()='Envelope']/*[local-name()='Header']` +
159
+ `/*[local-name()='Security' and namespace-uri()='${NS.WSSE}'][${index}]`,
160
+ action: 'append',
161
+ },
162
+ });
163
+ const signed = parseXml(signer.getSignedXml(), { location: 'envelope' });
164
+ const next = signed.documentElement;
165
+ if (next !== null) {
166
+ doc.replaceChild(doc.importNode(next, true), root);
167
+ }
168
+ }
169
+ /** Every `ds:Signature` element under `root`, in document order (depth-first, pre-order). */
170
+ function findAllSignatures(root) {
171
+ const found = [];
172
+ const walk = (node) => {
173
+ if (node.namespaceURI === NS.DS && node.localName === 'Signature') {
174
+ found.push(node);
175
+ }
176
+ for (let child = node.firstChild; child !== null; child = child.nextSibling) {
177
+ if (child.nodeType === 1) {
178
+ walk(child);
179
+ }
180
+ }
181
+ };
182
+ walk(root);
183
+ return found;
184
+ }
185
+ /** The `URI`s of a signature's `ds:Reference` children, without their leading `#`. */
186
+ function referenceUris(signature) {
187
+ const signedInfo = childElement(signature, NS.DS, 'SignedInfo');
188
+ if (signedInfo === undefined) {
189
+ return [];
190
+ }
191
+ const uris = [];
192
+ for (let node = signedInfo.firstChild; node !== null; node = node.nextSibling) {
193
+ const element = node;
194
+ if (element.nodeType === 1 && element.namespaceURI === NS.DS && element.localName === 'Reference') {
195
+ const uri = element.getAttribute('URI') ?? '';
196
+ uris.push(uri.startsWith('#') ? uri.slice(1) : uri);
197
+ }
198
+ }
199
+ return uris;
200
+ }
201
+ /**
202
+ * Verifies the `ds:Signature` in `xml` against `certPem`.
203
+ *
204
+ * The certificate is supplied by the caller rather than taken from the document's own
205
+ * `KeyInfo`: a signature is only meaningful against a key you already trust.
206
+ *
207
+ * @param xml the signed envelope
208
+ * @param options the certificate to verify against
209
+ * @returns whether the signature held, and which references it covered
210
+ */
211
+ export function verifySignature(xml, options) {
212
+ let signature;
213
+ try {
214
+ const root = parseXml(xml, { location: 'envelope' }).documentElement;
215
+ const signatures = root === null ? [] : findAllSignatures(root);
216
+ signature = signatures[options.signature?.index ?? 0];
217
+ }
218
+ catch (error) {
219
+ return { ok: false, references: [], error: error instanceof Error ? error.message : String(error) };
220
+ }
221
+ if (signature === undefined) {
222
+ return { ok: false, references: [], error: 'The document carries no ds:Signature element.' };
223
+ }
224
+ const references = referenceUris(signature);
225
+ const verifier = new SignedXml({
226
+ idMode: 'wssecurity',
227
+ publicCert: options.certPem,
228
+ // Trust the caller's certificate, never the one the document brought with it.
229
+ getCertFromKeyInfo: () => null,
230
+ });
231
+ try {
232
+ verifier.loadSignature(serializeXml(signature));
233
+ const ok = verifier.checkSignature(xml);
234
+ return ok ? { ok, references } : { ok, references, error: 'One or more references failed validation.' };
235
+ }
236
+ catch (error) {
237
+ return { ok: false, references, error: error instanceof Error ? error.message : String(error) };
238
+ }
239
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Builds the `wsu:Timestamp` element of an outgoing WS-Security header
3
+ * (WS-Security 1.0 utility schema).
4
+ */
5
+ import type { Element } from '@xmldom/xmldom';
6
+ /** What {@link buildTimestamp} needs. All time and identity comes in; nothing is read here. */
7
+ export interface BuildTimestampInput {
8
+ /** Seconds between `Created` and `Expires`; `0` (or less) omits `Expires`. */
9
+ readonly ttlSeconds: number;
10
+ /** Emit `.SSS` fractional seconds rather than whole seconds. */
11
+ readonly millisecondPrecision: boolean;
12
+ readonly clock: () => Date;
13
+ readonly uuid: () => string;
14
+ }
15
+ /**
16
+ * Formats `date` as an XSD `dateTime` in UTC, with or without milliseconds.
17
+ *
18
+ * @param date the instant to format
19
+ * @param millisecondPrecision include `.SSS`
20
+ * @returns e.g. `2026-09-09T12:00:00Z` or `2026-09-09T12:00:00.250Z`
21
+ */
22
+ export declare function formatWssDateTime(date: Date, millisecondPrecision: boolean): string;
23
+ /**
24
+ * Builds `<wsu:Timestamp wsu:Id="TS-…"><wsu:Created/>[<wsu:Expires/>]</wsu:Timestamp>`.
25
+ *
26
+ * @param input the TTL, precision and the injected clock/uuid
27
+ * @returns a detached element owned by a fresh document
28
+ */
29
+ export declare function buildTimestamp(input: BuildTimestampInput): Element;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Builds the `wsu:Timestamp` element of an outgoing WS-Security header
3
+ * (WS-Security 1.0 utility schema).
4
+ */
5
+ import { DOMImplementation } from '@xmldom/xmldom';
6
+ import { NS } from '../../xml/namespaces.js';
7
+ /**
8
+ * Formats `date` as an XSD `dateTime` in UTC, with or without milliseconds.
9
+ *
10
+ * @param date the instant to format
11
+ * @param millisecondPrecision include `.SSS`
12
+ * @returns e.g. `2026-09-09T12:00:00Z` or `2026-09-09T12:00:00.250Z`
13
+ */
14
+ export function formatWssDateTime(date, millisecondPrecision) {
15
+ const iso = date.toISOString();
16
+ return millisecondPrecision ? iso : `${iso.slice(0, 19)}Z`;
17
+ }
18
+ /**
19
+ * Builds `<wsu:Timestamp wsu:Id="TS-…"><wsu:Created/>[<wsu:Expires/>]</wsu:Timestamp>`.
20
+ *
21
+ * @param input the TTL, precision and the injected clock/uuid
22
+ * @returns a detached element owned by a fresh document
23
+ */
24
+ export function buildTimestamp(input) {
25
+ const doc = new DOMImplementation().createDocument(null, '', null);
26
+ const timestamp = doc.createElementNS(NS.WSU, 'wsu:Timestamp');
27
+ timestamp.setAttributeNS(NS.WSU, 'wsu:Id', `TS-${input.uuid()}`);
28
+ const created = input.clock();
29
+ const createdElement = doc.createElementNS(NS.WSU, 'wsu:Created');
30
+ createdElement.appendChild(doc.createTextNode(formatWssDateTime(created, input.millisecondPrecision)));
31
+ timestamp.appendChild(createdElement);
32
+ if (input.ttlSeconds > 0) {
33
+ const expiresElement = doc.createElementNS(NS.WSU, 'wsu:Expires');
34
+ const expires = new Date(created.getTime() + input.ttlSeconds * 1000);
35
+ expiresElement.appendChild(doc.createTextNode(formatWssDateTime(expires, input.millisecondPrecision)));
36
+ timestamp.appendChild(expiresElement);
37
+ }
38
+ return timestamp;
39
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Builds the `wsse:UsernameToken` element of an outgoing WS-Security header
3
+ * (WS-Security UsernameToken Profile 1.0).
4
+ */
5
+ import type { Element } from '@xmldom/xmldom';
6
+ import type { WssPasswordType } from '../model.js';
7
+ /** What {@link buildUsernameToken} needs; the password is already resolved by the host. */
8
+ export interface BuildUsernameTokenInput {
9
+ readonly username: string;
10
+ /** The resolved plaintext password; absent is treated as empty. */
11
+ readonly password?: string;
12
+ readonly passwordType: WssPasswordType;
13
+ readonly addNonce: boolean;
14
+ readonly addCreated: boolean;
15
+ readonly clock: () => Date;
16
+ readonly nonce: (bytes: number) => Uint8Array;
17
+ readonly uuid: () => string;
18
+ }
19
+ /**
20
+ * `Base64(SHA-1(nonce ‖ created ‖ password))`, the profile's `PasswordDigest`.
21
+ *
22
+ * @param nonce the raw nonce bytes (not their Base64 form)
23
+ * @param created the `wsu:Created` text, byte-for-byte as it appears in the token
24
+ * @param password the plaintext password
25
+ * @returns the Base64 digest
26
+ */
27
+ export declare function passwordDigest(nonce: Uint8Array, created: string, password: string): string;
28
+ /**
29
+ * Builds `<wsse:UsernameToken wsu:Id="UsernameToken-…">` with the username, an optional
30
+ * password (text or digest), and an optional nonce/created pair. `PasswordDigest` forces the
31
+ * nonce and created on, since the digest is not verifiable without them.
32
+ *
33
+ * @param input the credentials, the password type and the injected clock/nonce/uuid
34
+ * @returns a detached element owned by a fresh document
35
+ */
36
+ export declare function buildUsernameToken(input: BuildUsernameTokenInput): Element;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Builds the `wsse:UsernameToken` element of an outgoing WS-Security header
3
+ * (WS-Security UsernameToken Profile 1.0).
4
+ */
5
+ import { createHash } from 'node:crypto';
6
+ import { DOMImplementation } from '@xmldom/xmldom';
7
+ import { NS } from '../../xml/namespaces.js';
8
+ import { formatWssDateTime } from './timestamp.js';
9
+ /** `Type` attribute values of `wsse:Password`. */
10
+ const PROFILE = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0';
11
+ /** `EncodingType` of `wsse:Nonce`. */
12
+ const BASE64_BINARY = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
13
+ /** Nonce length the profile's examples use, and what every interoperable stack expects. */
14
+ const NONCE_BYTES = 16;
15
+ /**
16
+ * `Base64(SHA-1(nonce ‖ created ‖ password))`, the profile's `PasswordDigest`.
17
+ *
18
+ * @param nonce the raw nonce bytes (not their Base64 form)
19
+ * @param created the `wsu:Created` text, byte-for-byte as it appears in the token
20
+ * @param password the plaintext password
21
+ * @returns the Base64 digest
22
+ */
23
+ export function passwordDigest(nonce, created, password) {
24
+ return createHash('sha1')
25
+ .update(Buffer.concat([Buffer.from(nonce), Buffer.from(created, 'utf8'), Buffer.from(password, 'utf8')]))
26
+ .digest('base64');
27
+ }
28
+ /**
29
+ * Builds `<wsse:UsernameToken wsu:Id="UsernameToken-…">` with the username, an optional
30
+ * password (text or digest), and an optional nonce/created pair. `PasswordDigest` forces the
31
+ * nonce and created on, since the digest is not verifiable without them.
32
+ *
33
+ * @param input the credentials, the password type and the injected clock/nonce/uuid
34
+ * @returns a detached element owned by a fresh document
35
+ */
36
+ export function buildUsernameToken(input) {
37
+ const digest = input.passwordType === 'digest';
38
+ const withNonce = input.addNonce || digest;
39
+ const withCreated = input.addCreated || digest;
40
+ const nonceBytes = withNonce ? input.nonce(NONCE_BYTES) : undefined;
41
+ const created = withCreated ? formatWssDateTime(input.clock(), false) : undefined;
42
+ const doc = new DOMImplementation().createDocument(null, '', null);
43
+ const token = doc.createElementNS(NS.WSSE, 'wsse:UsernameToken');
44
+ token.setAttributeNS(NS.WSU, 'wsu:Id', `UsernameToken-${input.uuid()}`);
45
+ const append = (namespace, name, text) => {
46
+ const element = doc.createElementNS(namespace, name);
47
+ if (text !== undefined && text !== '') {
48
+ element.appendChild(doc.createTextNode(text));
49
+ }
50
+ token.appendChild(element);
51
+ return element;
52
+ };
53
+ append(NS.WSSE, 'wsse:Username', input.username);
54
+ if (input.passwordType !== 'none') {
55
+ const password = input.password ?? '';
56
+ const value = digest ? passwordDigest(nonceBytes ?? new Uint8Array(), created ?? '', password) : password;
57
+ const element = append(NS.WSSE, 'wsse:Password', value);
58
+ element.setAttribute('Type', `${PROFILE}#${digest ? 'PasswordDigest' : 'PasswordText'}`);
59
+ }
60
+ if (nonceBytes !== undefined) {
61
+ const element = append(NS.WSSE, 'wsse:Nonce', Buffer.from(nonceBytes).toString('base64'));
62
+ element.setAttribute('EncodingType', BASE64_BINARY);
63
+ }
64
+ if (created !== undefined) {
65
+ append(NS.WSU, 'wsu:Created', created);
66
+ }
67
+ return token;
68
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Locating the pieces of a secured envelope: the `soap:Header`, the `wsse:Security` block
3
+ * addressed to a given actor/role, and arbitrary elements named by `{namespace, localName}`.
4
+ * Shared by `apply.ts` (which builds the header) and `outgoing/signature.ts` (which has to find
5
+ * it again after `xml-crypto` has re-serialized the document).
6
+ */
7
+ import type { Document, Element } from '@xmldom/xmldom';
8
+ import type { SoapEnvelopeVersion } from '../soap/envelope.js';
9
+ /** The attribute name carrying the SOAP actor/role for `version`. */
10
+ export declare function actorAttribute(version: SoapEnvelopeVersion): string;
11
+ /** The `mustUnderstand` value `version` expects. */
12
+ export declare function mustUnderstandValue(version: SoapEnvelopeVersion): string;
13
+ /** The first child element of `parent` in `namespace` with local name `localName`. */
14
+ export declare function childElement(parent: Element, namespace: string, localName: string): Element | undefined;
15
+ /** Every `wsse:Security` header block in `header`, in document order. */
16
+ export declare function securityHeaders(header: Element): Element[];
17
+ /** The actor/role a `wsse:Security` element is addressed to, or `undefined` for the ultimate receiver. */
18
+ export declare function securityActor(security: Element, version: SoapEnvelopeVersion): string | undefined;
19
+ /**
20
+ * The index (1-based, as XPath counts) of the `wsse:Security` block addressed to `actor`,
21
+ * among `header`'s direct `wsse:Security` children — the same node set the XPath
22
+ * `signEnvelope` hands `xml-crypto` selects, so the two never disagree about which block is
23
+ * "the" one to sign into.
24
+ *
25
+ * @throws WssError `wss-security-missing` when no direct child is addressed to `actor`
26
+ */
27
+ export declare function securityIndex(header: Element, version: SoapEnvelopeVersion, actor?: string): number;
28
+ /** The first descendant-or-self of `root` in `namespace` with local name `localName`. */
29
+ export declare function findElement(root: Element, namespace: string, localName: string): Element | undefined;
30
+ /** Replaces `doc`'s document element with `replacement`'s, so callers holding `doc` stay valid. */
31
+ export declare function replaceDocumentElement(doc: Document, replacement: Document): void;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Locating the pieces of a secured envelope: the `soap:Header`, the `wsse:Security` block
3
+ * addressed to a given actor/role, and arbitrary elements named by `{namespace, localName}`.
4
+ * Shared by `apply.ts` (which builds the header) and `outgoing/signature.ts` (which has to find
5
+ * it again after `xml-crypto` has re-serialized the document).
6
+ */
7
+ import { WssError } from '../errors.js';
8
+ import { NS } from '../xml/namespaces.js';
9
+ import { envelopeNamespace } from '../soap/envelope.js';
10
+ /** The attribute name carrying the SOAP actor/role for `version`. */
11
+ export function actorAttribute(version) {
12
+ return version === '1.2' ? 'role' : 'actor';
13
+ }
14
+ /** The `mustUnderstand` value `version` expects. */
15
+ export function mustUnderstandValue(version) {
16
+ return version === '1.2' ? 'true' : '1';
17
+ }
18
+ /** The first child element of `parent` in `namespace` with local name `localName`. */
19
+ export function childElement(parent, namespace, localName) {
20
+ for (let node = parent.firstChild; node !== null; node = node.nextSibling) {
21
+ const element = node;
22
+ if (element.nodeType === 1 && element.namespaceURI === namespace && element.localName === localName) {
23
+ return element;
24
+ }
25
+ }
26
+ return undefined;
27
+ }
28
+ /** Every `wsse:Security` header block in `header`, in document order. */
29
+ export function securityHeaders(header) {
30
+ const found = [];
31
+ for (let node = header.firstChild; node !== null; node = node.nextSibling) {
32
+ const element = node;
33
+ if (element.nodeType === 1 && element.namespaceURI === NS.WSSE && element.localName === 'Security') {
34
+ found.push(element);
35
+ }
36
+ }
37
+ return found;
38
+ }
39
+ /** The actor/role a `wsse:Security` element is addressed to, or `undefined` for the ultimate receiver. */
40
+ export function securityActor(security, version) {
41
+ const value = security.getAttributeNS(envelopeNamespace(version), actorAttribute(version));
42
+ return value === null || value === '' ? undefined : value;
43
+ }
44
+ /**
45
+ * The index (1-based, as XPath counts) of the `wsse:Security` block addressed to `actor`,
46
+ * among `header`'s direct `wsse:Security` children — the same node set the XPath
47
+ * `signEnvelope` hands `xml-crypto` selects, so the two never disagree about which block is
48
+ * "the" one to sign into.
49
+ *
50
+ * @throws WssError `wss-security-missing` when no direct child is addressed to `actor`
51
+ */
52
+ export function securityIndex(header, version, actor) {
53
+ const index = securityHeaders(header).findIndex((element) => securityActor(element, version) === actor);
54
+ if (index === -1) {
55
+ throw new WssError('wss-security-missing', 'The envelope has no wsse:Security header addressed to the expected actor/role.');
56
+ }
57
+ return index + 1;
58
+ }
59
+ /** The first descendant-or-self of `root` in `namespace` with local name `localName`. */
60
+ export function findElement(root, namespace, localName) {
61
+ if (root.namespaceURI === namespace && root.localName === localName) {
62
+ return root;
63
+ }
64
+ for (let node = root.firstChild; node !== null; node = node.nextSibling) {
65
+ if (node.nodeType !== 1) {
66
+ continue;
67
+ }
68
+ const found = findElement(node, namespace, localName);
69
+ if (found !== undefined) {
70
+ return found;
71
+ }
72
+ }
73
+ return undefined;
74
+ }
75
+ /** Replaces `doc`'s document element with `replacement`'s, so callers holding `doc` stay valid. */
76
+ export function replaceDocumentElement(doc, replacement) {
77
+ const current = doc.documentElement;
78
+ const next = replacement.documentElement;
79
+ if (current === null || next === null) {
80
+ return;
81
+ }
82
+ doc.replaceChild(doc.importNode(next, true), current);
83
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Browser-safe subpath export (`@wirebench/engine/xml`): pure text helpers
3
+ * with no dependency on `@xmldom/xmldom` or any Node module, safe to bundle
4
+ * into the Electron renderer.
5
+ */
6
+ export { formatXml, type FormatXmlOptions, type FormatXmlResult } from './pretty.js';
7
+ export { elementPathAt, completionContextAt, type CompletionContext, type TextRange } from '../xsd/locate.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Browser-safe subpath export (`@wirebench/engine/xml`): pure text helpers
3
+ * with no dependency on `@xmldom/xmldom` or any Node module, safe to bundle
4
+ * into the Electron renderer.
5
+ */
6
+ export { formatXml } from './pretty.js';
7
+ export { elementPathAt, completionContextAt } from '../xsd/locate.js';
@@ -0,0 +1,36 @@
1
+ /**
2
+ * XML namespace URIs used across WSDL, SOAP, XSD, WS-Security, WS-Addressing
3
+ * and WS-Policy. Centralizing these avoids typos scattered through the
4
+ * codebase and gives every consumer the same canonical values.
5
+ */
6
+ export declare const NS: {
7
+ readonly WSDL: "http://schemas.xmlsoap.org/wsdl/";
8
+ readonly WSDL_SOAP11: "http://schemas.xmlsoap.org/wsdl/soap/";
9
+ readonly WSDL_SOAP12: "http://schemas.xmlsoap.org/wsdl/soap12/";
10
+ readonly WSDL_HTTP: "http://schemas.xmlsoap.org/wsdl/http/";
11
+ readonly WSDL_MIME: "http://schemas.xmlsoap.org/wsdl/mime/";
12
+ readonly SOAP11_ENV: "http://schemas.xmlsoap.org/soap/envelope/";
13
+ readonly SOAP11_ENC: "http://schemas.xmlsoap.org/soap/encoding/";
14
+ readonly SOAP12_ENV: "http://www.w3.org/2003/05/soap-envelope";
15
+ readonly SOAP12_ENC: "http://www.w3.org/2003/05/soap-encoding";
16
+ readonly XSD: "http://www.w3.org/2001/XMLSchema";
17
+ readonly XSI: "http://www.w3.org/2001/XMLSchema-instance";
18
+ readonly XML: "http://www.w3.org/XML/1998/namespace";
19
+ readonly XOP: "http://www.w3.org/2004/08/xop/include";
20
+ readonly XMLMIME: "http://www.w3.org/2005/05/xmlmime";
21
+ readonly WSSE: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
22
+ readonly WSU: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
23
+ readonly DS: "http://www.w3.org/2000/09/xmldsig#";
24
+ readonly XENC: "http://www.w3.org/2001/04/xmlenc#";
25
+ readonly WSA_200508: "http://www.w3.org/2005/08/addressing";
26
+ readonly WSA_200408: "http://schemas.xmlsoap.org/ws/2004/08/addressing";
27
+ readonly WSAW: "http://www.w3.org/2006/05/addressing/wsdl";
28
+ readonly WSAM: "http://www.w3.org/2007/05/addressing/metadata";
29
+ readonly WSAP_2004: "http://schemas.xmlsoap.org/ws/2004/08/addressing/policy";
30
+ readonly WSP: "http://www.w3.org/ns/ws-policy";
31
+ readonly WSP_2004: "http://schemas.xmlsoap.org/ws/2004/09/policy";
32
+ };
33
+ /** Union of every namespace URI known to {@link NS}. */
34
+ export type NamespaceUri = (typeof NS)[keyof typeof NS];
35
+ /** Conventional XML prefix for each namespace in {@link NS}. */
36
+ export declare const PREFIX: Record<keyof typeof NS, string>;