@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,377 @@
1
+ /**
2
+ * NTLM (MS-NLMP) message codec: the Type 1 (NEGOTIATE), Type 2 (CHALLENGE) and
3
+ * Type 3 (AUTHENTICATE) messages plus the NTLMv2/LMv2 response computation, as a
4
+ * pure byte-level module. The connection choreography lives in `ntlm-transport.ts`.
5
+ *
6
+ * Only NTLMv2 with extended session security is produced; no session key exchange,
7
+ * signing or sealing, none of which HTTP needs. No MIC is emitted (it is optional
8
+ * for a client that negotiates no key exchange).
9
+ */
10
+ import { createHmac } from 'node:crypto';
11
+ import { WirebenchError } from '../../errors.js';
12
+ import { md4 } from './md4.js';
13
+ const SIGNATURE = 'NTLMSSP\0';
14
+ const SIGNATURE_BYTES = new Uint8Array(Buffer.from(SIGNATURE, 'ascii'));
15
+ /** NTLM negotiate flags (MS-NLMP §2.2.2.5) this codec cares about. */
16
+ export const NTLM_FLAGS = {
17
+ NEGOTIATE_UNICODE: 0x00000001,
18
+ NEGOTIATE_OEM: 0x00000002,
19
+ REQUEST_TARGET: 0x00000004,
20
+ NEGOTIATE_NTLM: 0x00000200,
21
+ NEGOTIATE_OEM_DOMAIN_SUPPLIED: 0x00001000,
22
+ NEGOTIATE_OEM_WORKSTATION_SUPPLIED: 0x00002000,
23
+ NEGOTIATE_ALWAYS_SIGN: 0x00008000,
24
+ NEGOTIATE_EXTENDED_SESSIONSECURITY: 0x00080000,
25
+ NEGOTIATE_TARGET_INFO: 0x00800000,
26
+ NEGOTIATE_VERSION: 0x02000000,
27
+ NEGOTIATE_128: 0x20000000,
28
+ NEGOTIATE_56: 0x80000000,
29
+ };
30
+ /**
31
+ * The flag set every Wirebench Type 1/Type 3 message carries: Unicode names, NTLM with
32
+ * extended session security (NTLMv2), target info, a version block, and 128/56-bit key
33
+ * strengths. Deliberately *without* `NEGOTIATE_SIGN`/`SEAL`/`KEY_EXCH` — HTTP carries no
34
+ * signed or sealed payloads, so advertising them would only invite a server to expect one.
35
+ */
36
+ export const DEFAULT_NEGOTIATE_FLAGS = (NTLM_FLAGS.NEGOTIATE_UNICODE |
37
+ NTLM_FLAGS.REQUEST_TARGET |
38
+ NTLM_FLAGS.NEGOTIATE_NTLM |
39
+ NTLM_FLAGS.NEGOTIATE_ALWAYS_SIGN |
40
+ NTLM_FLAGS.NEGOTIATE_EXTENDED_SESSIONSECURITY |
41
+ NTLM_FLAGS.NEGOTIATE_TARGET_INFO |
42
+ NTLM_FLAGS.NEGOTIATE_VERSION |
43
+ NTLM_FLAGS.NEGOTIATE_128 |
44
+ NTLM_FLAGS.NEGOTIATE_56) >>>
45
+ 0;
46
+ /** AV pair identifiers (MS-NLMP §2.2.2.1). */
47
+ export const AV_IDS = {
48
+ MsvAvEOL: 0x0000,
49
+ MsvAvNbComputerName: 0x0001,
50
+ MsvAvNbDomainName: 0x0002,
51
+ MsvAvDnsComputerName: 0x0003,
52
+ MsvAvDnsDomainName: 0x0004,
53
+ MsvAvTimestamp: 0x0007,
54
+ MsvAvFlags: 0x0006,
55
+ };
56
+ /**
57
+ * The `Version` block (MS-NLMP §2.2.2.10): Windows 6.1 build 7601, NTLMSSP revision 15.
58
+ * Purely cosmetic — servers log it, none of them gate on it.
59
+ */
60
+ const VERSION_BLOCK = new Uint8Array([0x06, 0x01, 0xb1, 0x1d, 0x00, 0x00, 0x00, 0x0f]);
61
+ /** 100-nanosecond intervals between the Windows FILETIME epoch (1601-01-01) and the Unix epoch. */
62
+ const FILETIME_EPOCH_OFFSET = 11644473600000n;
63
+ /** Converts a Unix millisecond timestamp to a Windows FILETIME (100 ns ticks since 1601). */
64
+ export function toFileTime(unixMillis) {
65
+ return (BigInt(Math.floor(unixMillis)) + FILETIME_EPOCH_OFFSET) * 10000n;
66
+ }
67
+ function utf16le(value) {
68
+ return new Uint8Array(Buffer.from(value, 'utf16le'));
69
+ }
70
+ function oem(value) {
71
+ return new Uint8Array(Buffer.from(value, 'latin1'));
72
+ }
73
+ function concat(parts) {
74
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
75
+ const out = new Uint8Array(total);
76
+ let offset = 0;
77
+ for (const part of parts) {
78
+ out.set(part, offset);
79
+ offset += part.length;
80
+ }
81
+ return out;
82
+ }
83
+ function hmacMd5(key, data) {
84
+ return new Uint8Array(createHmac('md5', key).update(data).digest());
85
+ }
86
+ /** Reads a `(Len, MaxLen, BufferOffset)` field descriptor and returns the payload slice it points at. */
87
+ function readField(bytes, view, at) {
88
+ const length = view.getUint16(at, true);
89
+ const offset = view.getUint32(at + 4, true);
90
+ if (length === 0 || offset + length > bytes.length) {
91
+ return new Uint8Array(0);
92
+ }
93
+ return bytes.slice(offset, offset + length);
94
+ }
95
+ /** Writes a `(Len, MaxLen, BufferOffset)` field descriptor at `at`. */
96
+ function writeField(view, at, length, offset) {
97
+ view.setUint16(at, length, true);
98
+ view.setUint16(at + 2, length, true);
99
+ view.setUint32(at + 4, offset, true);
100
+ }
101
+ function hasSignature(bytes) {
102
+ if (bytes.length < 12)
103
+ return false;
104
+ return SIGNATURE_BYTES.every((byte, index) => bytes[index] === byte);
105
+ }
106
+ /**
107
+ * Builds a Type 1 NEGOTIATE message.
108
+ *
109
+ * @param options negotiate flags plus the optional domain/workstation to advertise
110
+ * @returns the raw message bytes, ready for {@link encodeNtlmAuthorization}
111
+ */
112
+ export function createType1(options) {
113
+ const domain = options?.domain !== undefined && options.domain !== '' ? oem(options.domain.toUpperCase()) : undefined;
114
+ const workstation = options?.workstation !== undefined && options.workstation !== ''
115
+ ? oem(options.workstation.toUpperCase())
116
+ : undefined;
117
+ let flags = options?.flags ?? DEFAULT_NEGOTIATE_FLAGS;
118
+ if (domain !== undefined)
119
+ flags = (flags | NTLM_FLAGS.NEGOTIATE_OEM_DOMAIN_SUPPLIED) >>> 0;
120
+ if (workstation !== undefined)
121
+ flags = (flags | NTLM_FLAGS.NEGOTIATE_OEM_WORKSTATION_SUPPLIED) >>> 0;
122
+ // 8 signature + 4 type + 8 domain field + 8 workstation field + 4 flags + 8 version.
123
+ const headerLength = 40;
124
+ const payload = concat([domain ?? new Uint8Array(0), workstation ?? new Uint8Array(0)]);
125
+ const message = new Uint8Array(headerLength + payload.length);
126
+ message.set(SIGNATURE_BYTES, 0);
127
+ const view = new DataView(message.buffer);
128
+ view.setUint32(8, 1, true);
129
+ view.setUint32(12, flags, true);
130
+ writeField(view, 16, domain?.length ?? 0, headerLength);
131
+ writeField(view, 24, workstation?.length ?? 0, headerLength + (domain?.length ?? 0));
132
+ message.set(VERSION_BLOCK, 32);
133
+ message.set(payload, headerLength);
134
+ return message;
135
+ }
136
+ /**
137
+ * Parses a Type 2 CHALLENGE message.
138
+ *
139
+ * @param bytes the raw message (already base64-decoded)
140
+ * @throws WirebenchError (`ntlm-invalid-message`) when the signature or message type is not a Type 2 message
141
+ */
142
+ export function parseType2(bytes) {
143
+ if (!hasSignature(bytes) || bytes.length < 32) {
144
+ throw new WirebenchError('ntlm-invalid-message', 'not an NTLM message');
145
+ }
146
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
147
+ if (view.getUint32(8, true) !== 2) {
148
+ throw new WirebenchError('ntlm-invalid-message', 'not an NTLM Type 2 message');
149
+ }
150
+ const flags = view.getUint32(20, true);
151
+ const targetNameBytes = readField(bytes, view, 12);
152
+ const targetInfo = bytes.length >= 48 ? readField(bytes, view, 40) : new Uint8Array(0);
153
+ const version = bytes.length >= 56 ? bytes.slice(48, 56) : undefined;
154
+ return {
155
+ flags,
156
+ serverChallenge: bytes.slice(24, 32),
157
+ targetName: Buffer.from(targetNameBytes).toString((flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0 ? 'utf16le' : 'latin1'),
158
+ targetInfo,
159
+ ...(version !== undefined ? { version } : {}),
160
+ };
161
+ }
162
+ /**
163
+ * `NTOWFv2` (MS-NLMP §3.3.2): `HMAC_MD5(MD4(UTF16LE(password)), UTF16LE(UPPER(user) + domain))`.
164
+ * The domain keeps its case; only the user name is upper-cased.
165
+ *
166
+ * @param username the account name
167
+ * @param domain the domain (empty string when there is none)
168
+ * @param password the plaintext password — never logged, never stored by this module
169
+ */
170
+ export function ntowfv2(username, domain, password) {
171
+ const ntHash = md4(utf16le(password));
172
+ return hmacMd5(ntHash, utf16le(username.toUpperCase() + domain));
173
+ }
174
+ /**
175
+ * Builds the NTLMv2 `temp` blob: version bytes, the timestamp, the client challenge and the
176
+ * server's AV pairs. Exported so a verifier can rebuild the exact blob it received.
177
+ */
178
+ export function ntlmv2Blob(params) {
179
+ const head = new Uint8Array(28);
180
+ const view = new DataView(head.buffer);
181
+ head[0] = 1; // Responserversion
182
+ head[1] = 1; // HiResponserversion
183
+ view.setBigUint64(8, params.timestamp, true);
184
+ head.set(params.clientChallenge, 16);
185
+ return concat([head, params.targetInfo, new Uint8Array(4)]);
186
+ }
187
+ /**
188
+ * `NTProofStr` (MS-NLMP §3.3.2): `HMAC_MD5(NTOWFv2, serverChallenge || temp)`.
189
+ *
190
+ * @param responseKeyNt the `NTOWFv2` for the account
191
+ * @param serverChallenge the 8-byte challenge from the Type 2 message
192
+ * @param blob the `temp` blob from {@link ntlmv2Blob}
193
+ */
194
+ export function ntProofString(responseKeyNt, serverChallenge, blob) {
195
+ return hmacMd5(responseKeyNt, concat([serverChallenge, blob]));
196
+ }
197
+ /**
198
+ * The LMv2 response: `HMAC_MD5(NTOWFv2, serverChallenge || clientChallenge) || clientChallenge`.
199
+ */
200
+ export function lmv2Response(responseKeyNt, serverChallenge, clientChallenge) {
201
+ return concat([hmacMd5(responseKeyNt, concat([serverChallenge, clientChallenge])), clientChallenge]);
202
+ }
203
+ /** Appends an `MsvAvFlags` AV pair to a target-info block whose `MsvAvEOL` terminator is replaced. */
204
+ function withAvPairs(targetInfo, extra) {
205
+ // Strip the trailing EOL pair (id 0, len 0 — all 4 bytes zero) so the extra pairs land before it.
206
+ let end = targetInfo.length;
207
+ if (end >= 4 &&
208
+ targetInfo[end - 4] === 0 &&
209
+ targetInfo[end - 3] === 0 &&
210
+ targetInfo[end - 2] === 0 &&
211
+ targetInfo[end - 1] === 0) {
212
+ end -= 4;
213
+ }
214
+ const parts = [targetInfo.slice(0, end)];
215
+ for (const pair of extra) {
216
+ const header = new Uint8Array(4);
217
+ const view = new DataView(header.buffer);
218
+ view.setUint16(0, pair.id, true);
219
+ view.setUint16(2, pair.value.length, true);
220
+ parts.push(header, pair.value);
221
+ }
222
+ parts.push(new Uint8Array(4)); // MsvAvEOL
223
+ return concat(parts);
224
+ }
225
+ /** Reads an AV-pair block into a list of `{id, value}` entries, stopping at `MsvAvEOL`. */
226
+ export function parseAvPairs(bytes) {
227
+ const pairs = [];
228
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
229
+ let offset = 0;
230
+ while (offset + 4 <= bytes.length) {
231
+ const id = view.getUint16(offset, true);
232
+ const length = view.getUint16(offset + 2, true);
233
+ if (id === AV_IDS.MsvAvEOL)
234
+ break;
235
+ if (offset + 4 + length > bytes.length)
236
+ break;
237
+ pairs.push({ id, value: bytes.slice(offset + 4, offset + 4 + length) });
238
+ offset += 4 + length;
239
+ }
240
+ return pairs;
241
+ }
242
+ /** Builds an AV-pair block from `{id, value}` entries, terminated with `MsvAvEOL`. */
243
+ export function buildAvPairs(pairs) {
244
+ return withAvPairs(new Uint8Array(4), pairs);
245
+ }
246
+ /**
247
+ * Builds a Type 3 AUTHENTICATE message answering `params.type2`, computing the NTLMv2 and
248
+ * LMv2 responses. The server's target info is carried through verbatim (with an
249
+ * `MsvAvTimestamp` added when the server sent none, and `MsvAvFlags` = 0 to state
250
+ * explicitly that no MIC follows).
251
+ *
252
+ * The password is used only to derive `NTOWFv2` and never appears in the message.
253
+ *
254
+ * When the server's Type 2 did not negotiate `NEGOTIATE_UNICODE`, the domain/user/workstation
255
+ * are OEM- (latin1-) encoded instead of UTF-16LE, and the Type 3's own flags clear the Unicode
256
+ * bit and set `NEGOTIATE_OEM`, matching what the server asked for.
257
+ *
258
+ * @param params the credentials, the parsed challenge and the injectable nonce/clock
259
+ */
260
+ export function createType3(params) {
261
+ const domain = params.domain ?? '';
262
+ const workstation = params.workstation ?? '';
263
+ const responseKeyNt = ntowfv2(params.username, domain, params.password);
264
+ const useUnicode = (params.type2.flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0;
265
+ const encodeName = useUnicode ? utf16le : oem;
266
+ const serverPairs = parseAvPairs(params.type2.targetInfo);
267
+ const hasTimestamp = serverPairs.some((pair) => pair.id === AV_IDS.MsvAvTimestamp);
268
+ const timestampBytes = new Uint8Array(8);
269
+ new DataView(timestampBytes.buffer).setBigUint64(0, params.timestamp, true);
270
+ const extra = [];
271
+ if (!hasTimestamp)
272
+ extra.push({ id: AV_IDS.MsvAvTimestamp, value: timestampBytes });
273
+ // MsvAvFlags = 0: no MIC is present. (Bit 0x02 would claim one, which we do not send.)
274
+ extra.push({ id: AV_IDS.MsvAvFlags, value: new Uint8Array(4) });
275
+ const targetInfo = extra.length > 0 ? withAvPairs(params.type2.targetInfo, extra) : params.type2.targetInfo;
276
+ const blob = ntlmv2Blob({ timestamp: params.timestamp, clientChallenge: params.clientChallenge, targetInfo });
277
+ const ntProofStr = ntProofString(responseKeyNt, params.type2.serverChallenge, blob);
278
+ const ntChallengeResponse = concat([ntProofStr, blob]);
279
+ const lmChallengeResponse = lmv2Response(responseKeyNt, params.type2.serverChallenge, params.clientChallenge);
280
+ const domainBytes = encodeName(domain);
281
+ const userBytes = encodeName(params.username);
282
+ const workstationBytes = encodeName(workstation);
283
+ // 8 signature + 4 type + 6 * 8 field descriptors + 4 flags + 8 version. No MIC.
284
+ const headerLength = 72;
285
+ const parts = [lmChallengeResponse, ntChallengeResponse, domainBytes, userBytes, workstationBytes];
286
+ const message = new Uint8Array(headerLength + parts.reduce((sum, part) => sum + part.length, 0));
287
+ message.set(SIGNATURE_BYTES, 0);
288
+ const view = new DataView(message.buffer);
289
+ view.setUint32(8, 3, true);
290
+ let offset = headerLength;
291
+ for (const [index, part] of parts.entries()) {
292
+ writeField(view, 12 + index * 8, part.length, offset);
293
+ message.set(part, offset);
294
+ offset += part.length;
295
+ }
296
+ // EncryptedRandomSessionKey: empty, since no key exchange is negotiated.
297
+ writeField(view, 52, 0, offset);
298
+ let responseFlags = DEFAULT_NEGOTIATE_FLAGS;
299
+ if (!useUnicode) {
300
+ responseFlags = (responseFlags & ~NTLM_FLAGS.NEGOTIATE_UNICODE) >>> 0;
301
+ responseFlags = (responseFlags | NTLM_FLAGS.NEGOTIATE_OEM) >>> 0;
302
+ }
303
+ view.setUint32(60, responseFlags, true);
304
+ message.set(VERSION_BLOCK, 64);
305
+ return { message, ntProofStr, ntChallengeResponse, lmChallengeResponse, responseKeyNt };
306
+ }
307
+ /**
308
+ * Parses a Type 3 AUTHENTICATE message. Used by the test NTLM server to verify a client's
309
+ * response independently of {@link createType3}.
310
+ *
311
+ * @param bytes the raw message (already base64-decoded)
312
+ * @throws WirebenchError (`ntlm-invalid-message`) when the signature or message type is not a Type 3 message
313
+ */
314
+ export function parseType3(bytes) {
315
+ if (!hasSignature(bytes) || bytes.length < 64) {
316
+ throw new WirebenchError('ntlm-invalid-message', 'not an NTLM message');
317
+ }
318
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
319
+ if (view.getUint32(8, true) !== 3) {
320
+ throw new WirebenchError('ntlm-invalid-message', 'not an NTLM Type 3 message');
321
+ }
322
+ const flags = view.getUint32(60, true);
323
+ const decode = (field) => Buffer.from(field).toString((flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0 ? 'utf16le' : 'latin1');
324
+ return {
325
+ flags,
326
+ lmChallengeResponse: readField(bytes, view, 12),
327
+ ntChallengeResponse: readField(bytes, view, 20),
328
+ domain: decode(readField(bytes, view, 28)),
329
+ username: decode(readField(bytes, view, 36)),
330
+ workstation: decode(readField(bytes, view, 44)),
331
+ };
332
+ }
333
+ /**
334
+ * Formats a message as an `Authorization`/`WWW-Authenticate` value: `NTLM <base64>`.
335
+ * Wirebench always answers with the `NTLM` scheme, even when the server advertised
336
+ * `Negotiate` — every server that offers raw NTLMSSP under `Negotiate` accepts it.
337
+ */
338
+ export function encodeNtlmAuthorization(message) {
339
+ return `NTLM ${Buffer.from(message).toString('base64')}`;
340
+ }
341
+ /**
342
+ * Extracts an NTLMSSP message from a `WWW-Authenticate` header value. Accepts both
343
+ * `NTLM <base64>` and `Negotiate <base64>` (only when the payload really is NTLMSSP,
344
+ * not a Kerberos/SPNEGO token), and tolerates several challenges in one header.
345
+ *
346
+ * @param header the raw header value, or `undefined` when the response had none
347
+ * @returns the decoded message bytes, or `undefined` when there is no usable NTLM challenge
348
+ */
349
+ export function parseNtlmChallengeHeader(header) {
350
+ if (header === undefined)
351
+ return undefined;
352
+ for (const part of header.split(',')) {
353
+ const match = /^\s*(NTLM|Negotiate)(?:\s+([A-Za-z0-9+/=]+))?\s*$/i.exec(part);
354
+ const token = match?.[2];
355
+ if (token === undefined || token === '')
356
+ continue;
357
+ let decoded;
358
+ try {
359
+ decoded = new Uint8Array(Buffer.from(token, 'base64'));
360
+ }
361
+ catch {
362
+ continue;
363
+ }
364
+ if (hasSignature(decoded))
365
+ return decoded;
366
+ }
367
+ return undefined;
368
+ }
369
+ /**
370
+ * True when `header` offers an NTLM (or NTLMSSP-over-Negotiate) challenge at all, including
371
+ * the bare `WWW-Authenticate: NTLM` that starts a handshake.
372
+ */
373
+ export function offersNtlm(header) {
374
+ if (header === undefined)
375
+ return false;
376
+ return header.split(',').some((part) => /^\s*(NTLM|Negotiate)(\s|$)/i.test(part));
377
+ }
@@ -0,0 +1,73 @@
1
+ import { ProxyAgent, type Dispatcher } from 'undici';
2
+ import type { HttpExchange, HttpRequest, ProxyOptions, TlsOptions } from './types.js';
3
+ /**
4
+ * Builds a dispatcher for the given TLS/proxy options. Callers that pass
5
+ * custom `tls`/`proxy` own the returned dispatcher (it is not cached) and
6
+ * should close it when done; callers with no options get the shared default
7
+ * keep-alive agent.
8
+ */
9
+ export declare function createDispatcher(opts: {
10
+ readonly tls?: TlsOptions;
11
+ readonly proxy?: ProxyOptions;
12
+ readonly keepAlive?: boolean;
13
+ /** Local interface address to bind outgoing sockets to; undici's `connect.localAddress`. */
14
+ readonly localAddress?: string;
15
+ /** Offer HTTP/2 in the ALPN handshake. Off by default; see `HttpRequest.allowH2`. */
16
+ readonly allowH2?: boolean;
17
+ }): Dispatcher;
18
+ /**
19
+ * The `ProxyAgent` options for one proxied request.
20
+ *
21
+ * The split between `requestTls` and `proxyTls` is the whole point: undici applies the
22
+ * agent-level `connect` to the socket it opens *to the proxy*, never to the TLS session inside
23
+ * the CONNECT tunnel — so passing our TLS settings there would silently drop the user's trust
24
+ * anchors, client certificate and `minVersion` for every proxied HTTPS request. `requestTls`
25
+ * is the tunnelled origin handshake (where those belong) and `proxyTls` carries only what
26
+ * describes the hop to the proxy itself, i.e. the bind address.
27
+ *
28
+ * `allowH2` is stated on `requestTls` rather than left to the agent, because undici builds the
29
+ * tunnelled connector from `requestTls` alone and its `allowH2` *defaults to true* — so an
30
+ * unstated flag offered `h2` in the ALPN of every proxied HTTPS handshake, including the ones
31
+ * whose client only speaks HTTP/1.1. Exported for the unit test that pins exactly that; not
32
+ * part of the package's public API (`index.ts` does not re-export it).
33
+ *
34
+ * @param proxy the resolved proxy to dial
35
+ * @param opts the send's TLS options and bind address
36
+ * @param allowH2 whether HTTP/2 may be negotiated, on the tunnelled handshake and the agent
37
+ * @param extra agent-level options merged on top (connection pooling, keep-alive)
38
+ */
39
+ export declare function proxyAgentOptionsFor(proxy: ProxyOptions, opts: {
40
+ readonly tls?: TlsOptions;
41
+ readonly localAddress?: string;
42
+ }, allowH2: boolean, extra?: Record<string, unknown>): ProxyAgent.Options;
43
+ /**
44
+ * Builds a dispatcher pinned to a single, non-pipelined connection per origin, using the
45
+ * same TLS/proxy/bind-address mapping as {@link createDispatcher}. NTLM authenticates the
46
+ * *connection*, not the request, so all three legs of its handshake have to travel over one
47
+ * socket; `connections: 1` plus keep-alive gives sequential requests exactly that. The caller
48
+ * owns the returned dispatcher and must close it.
49
+ */
50
+ export declare function createSingleConnectionDispatcher(opts: {
51
+ readonly tls?: TlsOptions;
52
+ readonly proxy?: ProxyOptions;
53
+ readonly localAddress?: string;
54
+ }): Dispatcher;
55
+ /**
56
+ * Sends one HTTP request and returns the full {@link HttpExchange}, including
57
+ * reconstructed raw wire bytes and best-effort timings. Redirects (301/302/
58
+ * 303/307/308) are followed manually when `req.followRedirects` is set, so we
59
+ * can record the `redirects[]` trail and apply fetch's POST→GET downgrade on
60
+ * 301/302/303.
61
+ *
62
+ * Non-2xx responses are returned as a normal exchange, never thrown — only
63
+ * transport-level failures (timeout, abort, DNS, TLS, refused connection,
64
+ * too many redirects, invalid URL) throw {@link HttpError}.
65
+ *
66
+ * A response exceeding `req.maxSizeBytes` is *not* an error: the exchange is
67
+ * returned with `truncated: true` and `body` cut at the cap, per the product
68
+ * decision that "Max Size" (Task 30) should notify, not fail, the exchange.
69
+ */
70
+ export declare function sendHttp(req: HttpRequest, options?: {
71
+ readonly dispatcher?: Dispatcher;
72
+ readonly now?: () => number;
73
+ }): Promise<HttpExchange>;