@techspokes/typescript-wsdl-client 1.1.5 → 1.2.0

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 (505) hide show
  1. package/README.md +80 -68
  2. package/dist/app/generateApp.d.ts +0 -1
  3. package/dist/app/generateApp.js +1 -1
  4. package/dist/app/generateCheckedApp.d.ts +38 -0
  5. package/dist/app/generateCheckedApp.js +108 -0
  6. package/dist/checkedPipeline.d.ts +155 -0
  7. package/dist/checkedPipeline.js +448 -0
  8. package/dist/checkedPlanning.d.ts +123 -0
  9. package/dist/checkedPlanning.js +268 -0
  10. package/dist/cli.d.ts +0 -1
  11. package/dist/cli.js +92 -2
  12. package/dist/client/checkedDirectRuntime.d.ts +40 -3
  13. package/dist/client/checkedDirectRuntime.js +28 -8
  14. package/dist/client/directClientRuntime.d.ts +27 -2
  15. package/dist/client/directClientRuntime.js +142 -89
  16. package/dist/client/directClientVersion.d.ts +3 -1
  17. package/dist/client/directClientVersion.js +3 -0
  18. package/dist/client/generateClient.d.ts +0 -1
  19. package/dist/client/generateClient.js +98 -28
  20. package/dist/client/generateDirectClient.d.ts +21 -3
  21. package/dist/client/generateDirectClient.js +138 -6
  22. package/dist/client/generateOperations.d.ts +0 -1
  23. package/dist/client/generateOperations.js +30 -11
  24. package/dist/client/generateTypes.d.ts +0 -1
  25. package/dist/client/generateUtils.d.ts +0 -1
  26. package/dist/client/generateUtils.js +7 -1
  27. package/dist/compiler/applicationGroups.d.ts +53 -0
  28. package/dist/compiler/applicationGroups.js +403 -0
  29. package/dist/compiler/buildCanonicalGraph.d.ts +0 -1
  30. package/dist/compiler/canonicalGraph.d.ts +4 -16
  31. package/dist/compiler/canonicalGraph.js +1 -8
  32. package/dist/compiler/catalogErrors.d.ts +0 -1
  33. package/dist/compiler/catalogProvenance.d.ts +0 -1
  34. package/dist/compiler/checkedAssessment.d.ts +0 -1
  35. package/dist/compiler/checkedAssessment.js +1 -1
  36. package/dist/compiler/checkedComponentSource.d.ts +16 -0
  37. package/dist/compiler/checkedComponentSource.js +31 -0
  38. package/dist/compiler/checkedSourcePreparation.d.ts +38 -1
  39. package/dist/compiler/checkedSourcePreparation.js +71 -0
  40. package/dist/compiler/complexTypeContent.d.ts +5 -6
  41. package/dist/compiler/complexTypeContent.js +2 -2
  42. package/dist/compiler/componentCorrespondence.d.ts +32 -0
  43. package/dist/compiler/componentCorrespondence.js +140 -0
  44. package/dist/compiler/componentRecordProjection.d.ts +112 -0
  45. package/dist/compiler/componentRecordProjection.js +329 -0
  46. package/dist/compiler/componentSoapPreparation.d.ts +20 -0
  47. package/dist/compiler/componentSoapPreparation.js +36 -0
  48. package/dist/compiler/composeCanonicalGraph.d.ts +0 -1
  49. package/dist/compiler/dataOwnership.d.ts +0 -1
  50. package/dist/compiler/dataOwnership.js +14 -4
  51. package/dist/compiler/datatypeValues.d.ts +0 -1
  52. package/dist/compiler/declarationIdentity.d.ts +22 -0
  53. package/dist/compiler/declarationIdentity.js +9 -0
  54. package/dist/compiler/directCodec.d.ts +79 -2
  55. package/dist/compiler/directCodec.js +310 -92
  56. package/dist/compiler/directExecutionPolicy.d.ts +0 -1
  57. package/dist/compiler/directOperation.d.ts +72 -8
  58. package/dist/compiler/directOperation.js +164 -19
  59. package/dist/compiler/directSoap.d.ts +29 -5
  60. package/dist/compiler/directSoap.js +154 -44
  61. package/dist/compiler/directSoapSource.d.ts +24 -1
  62. package/dist/compiler/directSoapSource.js +166 -19
  63. package/dist/compiler/directSourceCapsule.d.ts +74 -2
  64. package/dist/compiler/directSourceCapsule.js +484 -6
  65. package/dist/compiler/directStructure.d.ts +83 -6
  66. package/dist/compiler/directStructure.js +353 -58
  67. package/dist/compiler/directStructurePlan.d.ts +144 -2
  68. package/dist/compiler/directStructurePlan.js +615 -30
  69. package/dist/compiler/directValues.d.ts +76 -5
  70. package/dist/compiler/directValues.js +967 -117
  71. package/dist/compiler/finiteRe01Construction.d.ts +69 -0
  72. package/dist/compiler/finiteRe01Construction.js +422 -0
  73. package/dist/compiler/finiteRe01Verification.d.ts +81 -3
  74. package/dist/compiler/finiteRe01Verification.js +391 -4
  75. package/dist/compiler/generateCatalog.d.ts +0 -1
  76. package/dist/compiler/graphTraversal.d.ts +0 -1
  77. package/dist/compiler/hypotheticalScopedIdentity.d.ts +0 -1
  78. package/dist/compiler/legacyDeclarations.d.ts +26 -0
  79. package/dist/compiler/legacyDeclarations.js +144 -0
  80. package/dist/compiler/occurrenceAnalysis.d.ts +2 -1
  81. package/dist/compiler/occurrenceAnalysis.js +23 -7
  82. package/dist/compiler/originalSourceMembership.d.ts +0 -1
  83. package/dist/compiler/particleAttribution.d.ts +0 -1
  84. package/dist/compiler/particleAttribution.js +20 -0
  85. package/dist/compiler/particleDeclarationConsistency.d.ts +0 -1
  86. package/dist/compiler/particleDeclarationConsistency.js +9 -0
  87. package/dist/compiler/particleExtension.d.ts +0 -1
  88. package/dist/compiler/particleExtension.js +5 -1
  89. package/dist/compiler/particleLocalAssessment.d.ts +0 -1
  90. package/dist/compiler/particleRestriction.d.ts +0 -1
  91. package/dist/compiler/particleRestriction.js +6 -1
  92. package/dist/compiler/particleSemanticView.d.ts +2 -1
  93. package/dist/compiler/particleSemanticView.js +16 -3
  94. package/dist/compiler/particleWildcardRelation.d.ts +0 -1
  95. package/dist/compiler/projectionScalar.d.ts +49 -0
  96. package/dist/compiler/projectionScalar.js +218 -0
  97. package/dist/compiler/re01CandidateAssignments.d.ts +95 -0
  98. package/dist/compiler/re01CandidateAssignments.js +341 -0
  99. package/dist/compiler/re01CandidateCorrespondence.d.ts +22 -1
  100. package/dist/compiler/re01CandidateCorrespondence.js +167 -38
  101. package/dist/compiler/re01TypeProperties.d.ts +0 -1
  102. package/dist/compiler/re01TypePropertyValidation.d.ts +0 -1
  103. package/dist/compiler/resolveCanonicalGraph.d.ts +5 -2
  104. package/dist/compiler/resolveCanonicalGraph.js +77 -7
  105. package/dist/compiler/rpcStringValues.d.ts +30 -0
  106. package/dist/compiler/rpcStringValues.js +196 -0
  107. package/dist/compiler/rpcTypedValues.d.ts +48 -0
  108. package/dist/compiler/rpcTypedValues.js +190 -0
  109. package/dist/compiler/scalarSchemaAssessment.d.ts +0 -1
  110. package/dist/compiler/schemaAttributeGroupProperties.d.ts +0 -1
  111. package/dist/compiler/schemaAttributeProperties.d.ts +0 -1
  112. package/dist/compiler/schemaAttributeUses.d.ts +22 -2
  113. package/dist/compiler/schemaAttributeUses.js +86 -13
  114. package/dist/compiler/schemaBinaryWordReconstruction.d.ts +0 -1
  115. package/dist/compiler/schemaBuiltinFacets.d.ts +0 -1
  116. package/dist/compiler/schemaCalendarImages.d.ts +0 -1
  117. package/dist/compiler/schemaCalendarLanguage.d.ts +0 -1
  118. package/dist/compiler/schemaCompiler.d.ts +0 -1
  119. package/dist/compiler/schemaCompiler.js +44 -109
  120. package/dist/compiler/schemaComponentEquality.d.ts +0 -1
  121. package/dist/compiler/schemaConstructionAssessment.d.ts +34 -1
  122. package/dist/compiler/schemaConstructionAssessment.js +88 -6
  123. package/dist/compiler/schemaDatatypeValues.d.ts +0 -1
  124. package/dist/compiler/schemaDecimalLanguage.d.ts +0 -1
  125. package/dist/compiler/schemaDeclarationPrimitives.d.ts +7 -2
  126. package/dist/compiler/schemaDeclarationPrimitives.js +18 -1
  127. package/dist/compiler/schemaDocumentSyntax.d.ts +0 -1
  128. package/dist/compiler/schemaDurationLanguage.d.ts +0 -1
  129. package/dist/compiler/schemaElementInstance.d.ts +30 -0
  130. package/dist/compiler/schemaElementInstance.js +45 -0
  131. package/dist/compiler/schemaElementProperties.d.ts +0 -1
  132. package/dist/compiler/schemaEndpointWordCapacity.d.ts +0 -1
  133. package/dist/compiler/schemaExactCalendar.d.ts +0 -1
  134. package/dist/compiler/schemaFacetAnnotation.d.ts +0 -1
  135. package/dist/compiler/schemaGeneratedScalarShape.d.ts +0 -1
  136. package/dist/compiler/schemaGeneratedScalarShape.js +2 -0
  137. package/dist/compiler/schemaIdentityConstraints.d.ts +0 -1
  138. package/dist/compiler/schemaIeeeLanguage.d.ts +0 -1
  139. package/dist/compiler/schemaIntegerImages.d.ts +0 -1
  140. package/dist/compiler/schemaLexicalPredicates.d.ts +0 -1
  141. package/dist/compiler/schemaNotationProperties.d.ts +0 -1
  142. package/dist/compiler/schemaNumericImageConditions.d.ts +0 -1
  143. package/dist/compiler/schemaParticleWildcardProperties.d.ts +0 -1
  144. package/dist/compiler/schemaPattern.d.ts +0 -1
  145. package/dist/compiler/schemaRegularLanguage.d.ts +0 -1
  146. package/dist/compiler/schemaScalarContext.d.ts +5 -1
  147. package/dist/compiler/schemaScalarKernel.d.ts +0 -1
  148. package/dist/compiler/schemaScalarWitnesses.d.ts +0 -1
  149. package/dist/compiler/schemaSimpleTypeProperties.d.ts +0 -1
  150. package/dist/compiler/schemaSourceGrammar.d.ts +0 -1
  151. package/dist/compiler/schemaSourceLexical.d.ts +0 -1
  152. package/dist/compiler/schemaSourceValues.d.ts +0 -1
  153. package/dist/compiler/schemaSourceWildcards.d.ts +1 -2
  154. package/dist/compiler/schemaSourceWildcards.js +3 -1
  155. package/dist/compiler/schemaSymbolicSequences.d.ts +0 -1
  156. package/dist/compiler/schemaSymbolicValueSets.d.ts +0 -1
  157. package/dist/compiler/schemaSyntaxAssessment.d.ts +0 -1
  158. package/dist/compiler/schemaTemporalAliases.d.ts +0 -1
  159. package/dist/compiler/schemaTokenImages.d.ts +0 -1
  160. package/dist/compiler/schemaTypeIdentity.d.ts +0 -1
  161. package/dist/compiler/schemaTypeIdentity.js +2 -0
  162. package/dist/compiler/schemaTypeRelations.d.ts +0 -1
  163. package/dist/compiler/schemaUri.d.ts +0 -1
  164. package/dist/compiler/schemaValueContext.d.ts +0 -1
  165. package/dist/compiler/schemaValueImages.d.ts +0 -1
  166. package/dist/compiler/schemaValueSequences.d.ts +0 -1
  167. package/dist/compiler/semanticBudget.d.ts +18 -1
  168. package/dist/compiler/semanticBudget.js +17 -2
  169. package/dist/compiler/semanticCatalog.d.ts +2 -3
  170. package/dist/compiler/semanticContext.d.ts +12 -1
  171. package/dist/compiler/semanticContext.js +39 -0
  172. package/dist/compiler/semanticTypeDependencies.d.ts +0 -1
  173. package/dist/compiler/semanticTypeReference.d.ts +0 -1
  174. package/dist/compiler/shapeResolver.d.ts +0 -1
  175. package/dist/compiler/soapHeaders.d.ts +16 -0
  176. package/dist/compiler/soapHeaders.js +42 -0
  177. package/dist/compiler/sourceSchemaBinding.d.ts +0 -1
  178. package/dist/compiler/standardSchemaComponents.d.ts +71 -0
  179. package/dist/compiler/standardSchemaComponents.js +74 -0
  180. package/dist/compiler/standardSchemaConstruction.d.ts +20 -0
  181. package/dist/compiler/standardSchemaConstruction.js +34 -0
  182. package/dist/compiler/structuralCompanions.d.ts +0 -1
  183. package/dist/compiler/validateSemanticGraph.d.ts +0 -1
  184. package/dist/compiler/wildcardAlgebra.d.ts +0 -1
  185. package/dist/compiler/wsdlPolicyRequirements.d.ts +43 -0
  186. package/dist/compiler/wsdlPolicyRequirements.js +239 -0
  187. package/dist/config.d.ts +0 -1
  188. package/dist/gateway/generateCheckedGateway.d.ts +32 -0
  189. package/dist/gateway/generateCheckedGateway.js +293 -0
  190. package/dist/gateway/generateComposedGateway.d.ts +16 -0
  191. package/dist/gateway/generateComposedGateway.js +65 -0
  192. package/dist/gateway/generateGateway.d.ts +0 -1
  193. package/dist/gateway/generateGateway.js +1 -0
  194. package/dist/gateway/generators.d.ts +0 -1
  195. package/dist/gateway/generators.js +19 -4
  196. package/dist/gateway/helpers.d.ts +1 -1
  197. package/dist/gateway/helpers.js +15 -0
  198. package/dist/generation/componentShape.d.ts +14 -0
  199. package/dist/generation/componentShape.js +293 -0
  200. package/dist/generation/preamble.d.ts +0 -1
  201. package/dist/generation/sourceLayout.d.ts +13 -0
  202. package/dist/generation/sourceLayout.js +40 -0
  203. package/dist/generation/writeGeneratedSource.d.ts +0 -1
  204. package/dist/index.d.ts +11 -2
  205. package/dist/index.js +4 -1
  206. package/dist/loader/fetch.d.ts +0 -1
  207. package/dist/loader/orderedSyntax.d.ts +12 -1
  208. package/dist/loader/orderedSyntax.js +40 -6
  209. package/dist/loader/resolutionDepth.d.ts +0 -1
  210. package/dist/loader/schemaInput.d.ts +28 -1
  211. package/dist/loader/schemaInput.js +41 -4
  212. package/dist/loader/schemaResources.d.ts +2 -1
  213. package/dist/loader/schemaResources.js +45 -4
  214. package/dist/loader/wsdlLoader.d.ts +0 -1
  215. package/dist/multiServicePipeline.d.ts +41 -0
  216. package/dist/multiServicePipeline.js +287 -0
  217. package/dist/openapi/casing.d.ts +0 -1
  218. package/dist/openapi/composeOpenAPI.d.ts +29 -0
  219. package/dist/openapi/composeOpenAPI.js +322 -0
  220. package/dist/openapi/generateOpenAPI.d.ts +0 -1
  221. package/dist/openapi/generatePaths.d.ts +0 -1
  222. package/dist/openapi/generateSchemas.d.ts +0 -1
  223. package/dist/openapi/security.d.ts +0 -1
  224. package/dist/pipeline.d.ts +7 -3
  225. package/dist/pipeline.js +15 -0
  226. package/dist/test/generateCheckedTests.d.ts +17 -0
  227. package/dist/test/generateCheckedTests.js +60 -0
  228. package/dist/test/generateTests.d.ts +0 -1
  229. package/dist/test/generators.d.ts +0 -1
  230. package/dist/test/mockData.d.ts +0 -1
  231. package/dist/test/mockData.js +20 -14
  232. package/dist/util/attributeWildcards.d.ts +0 -1
  233. package/dist/util/builder.d.ts +0 -1
  234. package/dist/util/catalogMeta.d.ts +0 -1
  235. package/dist/util/checkedCliDiagnostics.d.ts +11 -0
  236. package/dist/util/checkedCliDiagnostics.js +22 -0
  237. package/dist/util/cli.d.ts +0 -1
  238. package/dist/util/errors.d.ts +0 -1
  239. package/dist/util/imports.d.ts +0 -1
  240. package/dist/util/runtimeSource.d.ts +0 -1
  241. package/dist/util/runtimeSource.js +3 -5
  242. package/dist/util/securityConfig.d.ts +0 -1
  243. package/dist/util/streamConfig.d.ts +0 -1
  244. package/dist/util/tools.d.ts +0 -1
  245. package/dist/util/xmlWhitespace.d.ts +0 -1
  246. package/dist/xsd/primitives.d.ts +0 -1
  247. package/docs/agent-skill.md +12 -1
  248. package/docs/api-reference.md +127 -9
  249. package/docs/checked-gateway.md +212 -0
  250. package/docs/checked-generation.md +167 -0
  251. package/docs/cli-reference.md +48 -6
  252. package/docs/concepts.md +139 -5
  253. package/docs/configuration.md +15 -4
  254. package/docs/corpus.md +33 -0
  255. package/docs/direct-values.md +13 -13
  256. package/docs/examples/checked-forecast.wsdl +19 -0
  257. package/docs/gateway-guide.md +104 -27
  258. package/docs/generated-code.md +22 -11
  259. package/docs/mapping-contract.md +114 -0
  260. package/docs/migration-playbook.md +5 -1
  261. package/docs/migration.md +124 -6
  262. package/docs/output-anatomy.md +21 -18
  263. package/docs/production.md +7 -5
  264. package/docs/start-here.md +19 -3
  265. package/docs/supported-patterns.md +24 -3
  266. package/docs/testing.md +119 -31
  267. package/docs/troubleshooting.md +3 -1
  268. package/llms.txt +16 -8
  269. package/package.json +64 -23
  270. package/src/runtime/checkedGatewayHost.tpl.txt +157 -0
  271. package/src/runtime/clientStreamMethods.tpl.txt +156 -148
  272. package/src/runtime/operationsStreamHelper.tpl.txt +6 -6
  273. package/src/runtime/streamXml.ts +49 -21
  274. package/dist/app/generateApp.d.ts.map +0 -1
  275. package/dist/cli.d.ts.map +0 -1
  276. package/dist/client/checkedDirectRuntime.d.ts.map +0 -1
  277. package/dist/client/directClientRuntime.d.ts.map +0 -1
  278. package/dist/client/directClientVersion.d.ts.map +0 -1
  279. package/dist/client/generateClient.d.ts.map +0 -1
  280. package/dist/client/generateDirectClient.d.ts.map +0 -1
  281. package/dist/client/generateOperations.d.ts.map +0 -1
  282. package/dist/client/generateTypes.d.ts.map +0 -1
  283. package/dist/client/generateUtils.d.ts.map +0 -1
  284. package/dist/compiler/buildCanonicalGraph.d.ts.map +0 -1
  285. package/dist/compiler/canonicalGraph.d.ts.map +0 -1
  286. package/dist/compiler/catalogErrors.d.ts.map +0 -1
  287. package/dist/compiler/catalogProvenance.d.ts.map +0 -1
  288. package/dist/compiler/checkedAssessment.d.ts.map +0 -1
  289. package/dist/compiler/checkedSourcePreparation.d.ts.map +0 -1
  290. package/dist/compiler/complexTypeContent.d.ts.map +0 -1
  291. package/dist/compiler/composeCanonicalGraph.d.ts.map +0 -1
  292. package/dist/compiler/dataOwnership.d.ts.map +0 -1
  293. package/dist/compiler/datatypeValues.d.ts.map +0 -1
  294. package/dist/compiler/directCodec.d.ts.map +0 -1
  295. package/dist/compiler/directExecutionPolicy.d.ts.map +0 -1
  296. package/dist/compiler/directOperation.d.ts.map +0 -1
  297. package/dist/compiler/directSoap.d.ts.map +0 -1
  298. package/dist/compiler/directSoapSource.d.ts.map +0 -1
  299. package/dist/compiler/directSourceCapsule.d.ts.map +0 -1
  300. package/dist/compiler/directStructure.d.ts.map +0 -1
  301. package/dist/compiler/directStructurePlan.d.ts.map +0 -1
  302. package/dist/compiler/directValues.d.ts.map +0 -1
  303. package/dist/compiler/finiteRe01Verification.d.ts.map +0 -1
  304. package/dist/compiler/generateCatalog.d.ts.map +0 -1
  305. package/dist/compiler/graphTraversal.d.ts.map +0 -1
  306. package/dist/compiler/hypotheticalScopedIdentity.d.ts.map +0 -1
  307. package/dist/compiler/occurrenceAnalysis.d.ts.map +0 -1
  308. package/dist/compiler/originalSourceMembership.d.ts.map +0 -1
  309. package/dist/compiler/particleAttribution.d.ts.map +0 -1
  310. package/dist/compiler/particleDeclarationConsistency.d.ts.map +0 -1
  311. package/dist/compiler/particleExtension.d.ts.map +0 -1
  312. package/dist/compiler/particleLocalAssessment.d.ts.map +0 -1
  313. package/dist/compiler/particleRestriction.d.ts.map +0 -1
  314. package/dist/compiler/particleSemanticView.d.ts.map +0 -1
  315. package/dist/compiler/particleWildcardRelation.d.ts.map +0 -1
  316. package/dist/compiler/re01CandidateCorrespondence.d.ts.map +0 -1
  317. package/dist/compiler/re01TypeProperties.d.ts.map +0 -1
  318. package/dist/compiler/re01TypePropertyValidation.d.ts.map +0 -1
  319. package/dist/compiler/resolveCanonicalGraph.d.ts.map +0 -1
  320. package/dist/compiler/scalarSchemaAssessment.d.ts.map +0 -1
  321. package/dist/compiler/schemaAttributeGroupProperties.d.ts.map +0 -1
  322. package/dist/compiler/schemaAttributeProperties.d.ts.map +0 -1
  323. package/dist/compiler/schemaAttributeUses.d.ts.map +0 -1
  324. package/dist/compiler/schemaBinaryWordReconstruction.d.ts.map +0 -1
  325. package/dist/compiler/schemaBuiltinFacets.d.ts.map +0 -1
  326. package/dist/compiler/schemaCalendarImages.d.ts.map +0 -1
  327. package/dist/compiler/schemaCalendarLanguage.d.ts.map +0 -1
  328. package/dist/compiler/schemaCompiler.d.ts.map +0 -1
  329. package/dist/compiler/schemaComponentEquality.d.ts.map +0 -1
  330. package/dist/compiler/schemaConstructionAssessment.d.ts.map +0 -1
  331. package/dist/compiler/schemaDatatypeValues.d.ts.map +0 -1
  332. package/dist/compiler/schemaDecimalLanguage.d.ts.map +0 -1
  333. package/dist/compiler/schemaDeclarationPrimitives.d.ts.map +0 -1
  334. package/dist/compiler/schemaDocumentSyntax.d.ts.map +0 -1
  335. package/dist/compiler/schemaDurationLanguage.d.ts.map +0 -1
  336. package/dist/compiler/schemaElementProperties.d.ts.map +0 -1
  337. package/dist/compiler/schemaEndpointWordCapacity.d.ts.map +0 -1
  338. package/dist/compiler/schemaExactCalendar.d.ts.map +0 -1
  339. package/dist/compiler/schemaFacetAnnotation.d.ts.map +0 -1
  340. package/dist/compiler/schemaGeneratedScalarShape.d.ts.map +0 -1
  341. package/dist/compiler/schemaIdentityConstraints.d.ts.map +0 -1
  342. package/dist/compiler/schemaIeeeLanguage.d.ts.map +0 -1
  343. package/dist/compiler/schemaIntegerImages.d.ts.map +0 -1
  344. package/dist/compiler/schemaLexicalPredicates.d.ts.map +0 -1
  345. package/dist/compiler/schemaNotationProperties.d.ts.map +0 -1
  346. package/dist/compiler/schemaNumericImageConditions.d.ts.map +0 -1
  347. package/dist/compiler/schemaParticleWildcardProperties.d.ts.map +0 -1
  348. package/dist/compiler/schemaPattern.d.ts.map +0 -1
  349. package/dist/compiler/schemaRegularLanguage.d.ts.map +0 -1
  350. package/dist/compiler/schemaScalarContext.d.ts.map +0 -1
  351. package/dist/compiler/schemaScalarKernel.d.ts.map +0 -1
  352. package/dist/compiler/schemaScalarWitnesses.d.ts.map +0 -1
  353. package/dist/compiler/schemaSimpleTypeProperties.d.ts.map +0 -1
  354. package/dist/compiler/schemaSourceGrammar.d.ts.map +0 -1
  355. package/dist/compiler/schemaSourceLexical.d.ts.map +0 -1
  356. package/dist/compiler/schemaSourceValues.d.ts.map +0 -1
  357. package/dist/compiler/schemaSourceWildcards.d.ts.map +0 -1
  358. package/dist/compiler/schemaSymbolicSequences.d.ts.map +0 -1
  359. package/dist/compiler/schemaSymbolicValueSets.d.ts.map +0 -1
  360. package/dist/compiler/schemaSyntaxAssessment.d.ts.map +0 -1
  361. package/dist/compiler/schemaTemporalAliases.d.ts.map +0 -1
  362. package/dist/compiler/schemaTokenImages.d.ts.map +0 -1
  363. package/dist/compiler/schemaTypeIdentity.d.ts.map +0 -1
  364. package/dist/compiler/schemaTypeRelations.d.ts.map +0 -1
  365. package/dist/compiler/schemaUri.d.ts.map +0 -1
  366. package/dist/compiler/schemaValueContext.d.ts.map +0 -1
  367. package/dist/compiler/schemaValueImages.d.ts.map +0 -1
  368. package/dist/compiler/schemaValueSequences.d.ts.map +0 -1
  369. package/dist/compiler/semanticBudget.d.ts.map +0 -1
  370. package/dist/compiler/semanticCatalog.d.ts.map +0 -1
  371. package/dist/compiler/semanticContext.d.ts.map +0 -1
  372. package/dist/compiler/semanticTypeDependencies.d.ts.map +0 -1
  373. package/dist/compiler/semanticTypeReference.d.ts.map +0 -1
  374. package/dist/compiler/shapeResolver.d.ts.map +0 -1
  375. package/dist/compiler/sourceSchemaBinding.d.ts.map +0 -1
  376. package/dist/compiler/structuralCompanions.d.ts.map +0 -1
  377. package/dist/compiler/validateSemanticGraph.d.ts.map +0 -1
  378. package/dist/compiler/wildcardAlgebra.d.ts.map +0 -1
  379. package/dist/config.d.ts.map +0 -1
  380. package/dist/gateway/generateGateway.d.ts.map +0 -1
  381. package/dist/gateway/generators.d.ts.map +0 -1
  382. package/dist/gateway/helpers.d.ts.map +0 -1
  383. package/dist/generation/preamble.d.ts.map +0 -1
  384. package/dist/generation/writeGeneratedSource.d.ts.map +0 -1
  385. package/dist/index.d.ts.map +0 -1
  386. package/dist/loader/fetch.d.ts.map +0 -1
  387. package/dist/loader/orderedSyntax.d.ts.map +0 -1
  388. package/dist/loader/resolutionDepth.d.ts.map +0 -1
  389. package/dist/loader/schemaInput.d.ts.map +0 -1
  390. package/dist/loader/schemaResources.d.ts.map +0 -1
  391. package/dist/loader/wsdlLoader.d.ts.map +0 -1
  392. package/dist/openapi/casing.d.ts.map +0 -1
  393. package/dist/openapi/generateOpenAPI.d.ts.map +0 -1
  394. package/dist/openapi/generatePaths.d.ts.map +0 -1
  395. package/dist/openapi/generateSchemas.d.ts.map +0 -1
  396. package/dist/openapi/security.d.ts.map +0 -1
  397. package/dist/pipeline.d.ts.map +0 -1
  398. package/dist/runtime/jsonArray.d.ts +0 -24
  399. package/dist/runtime/jsonArray.d.ts.map +0 -1
  400. package/dist/runtime/jsonArray.js +0 -52
  401. package/dist/runtime/ndjson.d.ts +0 -24
  402. package/dist/runtime/ndjson.d.ts.map +0 -1
  403. package/dist/runtime/ndjson.js +0 -30
  404. package/dist/runtime/streamXml.d.ts +0 -45
  405. package/dist/runtime/streamXml.d.ts.map +0 -1
  406. package/dist/runtime/streamXml.js +0 -212
  407. package/dist/test/generateTests.d.ts.map +0 -1
  408. package/dist/test/generators.d.ts.map +0 -1
  409. package/dist/test/mockData.d.ts.map +0 -1
  410. package/dist/util/attributeWildcards.d.ts.map +0 -1
  411. package/dist/util/builder.d.ts.map +0 -1
  412. package/dist/util/catalogMeta.d.ts.map +0 -1
  413. package/dist/util/cli.d.ts.map +0 -1
  414. package/dist/util/errors.d.ts.map +0 -1
  415. package/dist/util/imports.d.ts.map +0 -1
  416. package/dist/util/runtimeSource.d.ts.map +0 -1
  417. package/dist/util/securityConfig.d.ts.map +0 -1
  418. package/dist/util/streamConfig.d.ts.map +0 -1
  419. package/dist/util/tools.d.ts.map +0 -1
  420. package/dist/util/xmlWhitespace.d.ts.map +0 -1
  421. package/dist/xsd/primitives.d.ts.map +0 -1
  422. package/docs/AGENTS.md +0 -47
  423. package/docs/README.md +0 -69
  424. package/docs/architecture.md +0 -158
  425. package/docs/content-model-analysis.md +0 -92
  426. package/docs/content-model-baseline.md +0 -121
  427. package/docs/content-model-catalog.md +0 -116
  428. package/docs/content-model-companions.md +0 -90
  429. package/docs/content-model-composition.md +0 -103
  430. package/docs/content-model-decisions.md +0 -79
  431. package/docs/content-model-gateway-feasibility.md +0 -169
  432. package/docs/content-model-graph.md +0 -121
  433. package/docs/content-model-loading.md +0 -163
  434. package/docs/content-model-matching.md +0 -85
  435. package/docs/content-model-readiness.md +0 -144
  436. package/docs/content-model-resolution.md +0 -81
  437. package/docs/content-model-s02-handoff.md +0 -98
  438. package/docs/content-model-s06-au-01.md +0 -425
  439. package/docs/content-model-s06-dt-01.md +0 -386
  440. package/docs/content-model-s06-pw-01.md +0 -350
  441. package/docs/content-model-s06-re-01-resolver-implementation.md +0 -869
  442. package/docs/content-model-s06-re-01-resolver.md +0 -513
  443. package/docs/content-model-s06-re-01-scalar-witnesses.md +0 -1423
  444. package/docs/content-model-s06-re-01-support-reconstruction.md +0 -6337
  445. package/docs/content-model-s06-re-01.md +0 -7477
  446. package/docs/content-model-s06-research-handoff.md +0 -909
  447. package/docs/content-model-shipped-fix.md +0 -83
  448. package/docs/content-model-soap-feasibility.md +0 -165
  449. package/docs/decisions/001-test-generation.md +0 -36
  450. package/docs/decisions/002-streamable-responses.md +0 -332
  451. package/docs/decisions/003-content-model-contracts.md +0 -280
  452. package/docs/file-naming-and-path-organization.md +0 -213
  453. package/docs/reference-validation.md +0 -243
  454. package/docs/releases/README.md +0 -94
  455. package/docs/releases/v0.20.0.md +0 -22
  456. package/docs/releases/v0.21.0.md +0 -30
  457. package/docs/releases/v0.22.0.md +0 -30
  458. package/docs/releases/v0.23.0.md +0 -31
  459. package/docs/releases/v0.24.0.md +0 -38
  460. package/docs/releases/v0.25.0.md +0 -31
  461. package/docs/releases/v0.25.2.md +0 -32
  462. package/docs/releases/v0.26.0.md +0 -32
  463. package/docs/releases/v0.27.0.md +0 -31
  464. package/docs/releases/v0.28.0.md +0 -32
  465. package/docs/releases/v0.29.0.md +0 -32
  466. package/docs/releases/v0.30.0.md +0 -30
  467. package/docs/releases/v0.30.1.md +0 -31
  468. package/docs/releases/v0.30.2.md +0 -30
  469. package/docs/releases/v0.30.3.md +0 -33
  470. package/docs/releases/v0.31.0.md +0 -33
  471. package/docs/releases/v0.32.0.md +0 -33
  472. package/docs/releases/v0.33.0.md +0 -34
  473. package/docs/releases/v0.34.0.md +0 -30
  474. package/docs/releases/v0.35.0.md +0 -33
  475. package/docs/releases/v0.36.0.md +0 -32
  476. package/docs/releases/v0.37.0.md +0 -33
  477. package/docs/releases/v0.38.0.md +0 -35
  478. package/docs/releases/v0.39.0.md +0 -35
  479. package/docs/releases/v0.40.0.md +0 -45
  480. package/docs/releases/v0.40.1.md +0 -34
  481. package/docs/releases/v1.0.0.md +0 -42
  482. package/docs/releases/v1.0.1.md +0 -38
  483. package/docs/releases/v1.0.2.md +0 -51
  484. package/docs/releases/v1.0.3.md +0 -37
  485. package/docs/releases/v1.0.4.md +0 -45
  486. package/docs/releases/v1.0.5.md +0 -41
  487. package/docs/releases/v1.0.6.md +0 -35
  488. package/docs/releases/v1.0.7.md +0 -36
  489. package/docs/releases/v1.1.0.md +0 -42
  490. package/docs/releases/v1.1.1.md +0 -44
  491. package/docs/releases/v1.1.2.md +0 -42
  492. package/docs/releases/v1.1.3.md +0 -36
  493. package/docs/releases/v1.1.4.md +0 -36
  494. package/docs/releases/v1.1.5.md +0 -38
  495. package/docs/roadmap/README.md +0 -107
  496. package/docs/roadmap/v1.0-capability-conformance-framework.md +0 -582
  497. package/docs/roadmap/v1.0-choice-union-mode.md +0 -90
  498. package/docs/roadmap/v1.0-contract-audit.md +0 -75
  499. package/docs/roadmap/v1.0-json-array-streaming.md +0 -101
  500. package/docs/roadmap/v1.0-openapi-fastify-compatibility.md +0 -99
  501. package/docs/roadmap/v1.0-release-candidate-gates.md +0 -92
  502. package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +0 -200
  503. package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +0 -932
  504. package/src/runtime/jsonArray.ts +0 -55
  505. package/src/runtime/ndjson.ts +0 -32
@@ -0,0 +1,157 @@
1
+ import Fastify from 'fastify';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import {createHash} from 'node:crypto';
5
+ import {types} from 'node:util';
6
+ import {fileURLToPath, pathToFileURL} from 'node:url';
7
+ import gateway, {expectedOpenApiJson} from __GATEWAY_IMPORT__;
8
+ import {selection, type Options} from __CLIENT_IMPORT__;
9
+
10
+ export interface CheckedGatewayConfig {
11
+ readonly localSource?: string;
12
+ readonly fileRoots?: readonly string[];
13
+ readonly endpoint?: string;
14
+ readonly allowedEndpoints?: readonly string[];
15
+ readonly capsuleFiles?: Readonly<Record<string, string>>;
16
+ readonly sourceResources?: Options['sourceResources'];
17
+ readonly sourceOrigins?: Options['sourceOrigins'];
18
+ readonly sourceUri?: string;
19
+ readonly namespaceLocations?: Options['namespaceLocations'];
20
+ readonly standardLibraries?: Options['standardLibraries'];
21
+ readonly recordSources?: Options['recordSources'];
22
+ readonly caFile?: string;
23
+ readonly host?: string;
24
+ readonly port?: number;
25
+ readonly timeoutMs?: number;
26
+ readonly limits?: Options['soap']['limits'];
27
+ readonly capabilities?: Options['soap']['capabilities'];
28
+ readonly signal?: AbortSignal;
29
+ }
30
+ type SourceConfig = CheckedGatewayConfig & Required<Pick<CheckedGatewayConfig,
31
+ 'localSource' | 'fileRoots' | 'sourceResources' | 'sourceOrigins'>>;
32
+
33
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
34
+ const projectRoot = fs.existsSync(path.join(moduleDir, 'package.json')) ? moduleDir : path.resolve(moduleDir, '..');
35
+ const defaultCapsules = __CAPSULE_FILES__;
36
+
37
+ function generatedSources(): SourceConfig {
38
+ const recordFile = path.resolve(projectRoot, __SOURCE_RECORD__);
39
+ const owner = fs.realpathSync(path.dirname(recordFile));
40
+ const record = JSON.parse(fs.readFileSync(recordFile, 'utf8')) as {
41
+ version?: unknown; resources?: readonly {file: string; digest: string}[]; runtime?: SourceConfig;
42
+ };
43
+ if (record.version !== 'checked-source-resources-v2' || !Array.isArray(record.resources) || !record.runtime)
44
+ throw new Error('incompatible-artifact: regenerate the host and source records together, or supply complete explicit source configuration');
45
+ const ownedFile = (value: string): string => {
46
+ if (typeof value !== 'string' || !value || path.isAbsolute(value)) throw new Error('Generated source path must be relative to its owner');
47
+ const file = fs.realpathSync(path.resolve(owner, value));
48
+ const relative = path.relative(owner, file);
49
+ if (relative === '..' || relative.startsWith('..' + path.sep) || path.isAbsolute(relative))
50
+ throw new Error('Generated source path escapes its owner');
51
+ return file;
52
+ };
53
+ const resources = new Set<string>();
54
+ for (const resource of record.resources) {
55
+ const file = ownedFile(resource.file);
56
+ if (resources.has(file) || createHash('sha256').update(fs.readFileSync(file)).digest('hex') !== resource.digest)
57
+ throw new Error('incompatible-artifact: stale or mixed generated source records');
58
+ resources.add(file);
59
+ }
60
+ const sourceFile = (value: string): string => {
61
+ const file = ownedFile(value);
62
+ if (!resources.has(file)) throw new Error('Generated source is absent from its owned snapshot inventory');
63
+ return file;
64
+ };
65
+ const logical = (value: string): string => /^[A-Za-z][A-Za-z0-9+.-]*:/.test(value)
66
+ ? value : pathToFileURL(sourceFile(value)).href;
67
+ const supplied = record.runtime;
68
+ const sourceKeys = ['localSource', 'fileRoots', 'capsuleFiles', 'sourceResources', 'sourceOrigins', 'sourceUri', 'namespaceLocations', 'recordSources', 'standardLibraries'];
69
+ if (Object.keys(supplied).some(key => !sourceKeys.includes(key))) throw new Error('Generated bookkeeping may contain only source and artifact records');
70
+ if (JSON.stringify(supplied.fileRoots) !== '["."]' || !Array.isArray(supplied.sourceResources) || !Array.isArray(supplied.sourceOrigins))
71
+ throw new Error('Generated source permissions require the owned closed snapshots');
72
+ return {...supplied, localSource: sourceFile(supplied.localSource), fileRoots: [owner],
73
+ capsuleFiles: Object.fromEntries(Object.entries(supplied.capsuleFiles ?? {}).map(([name, file]) => [name, ownedFile(file)])),
74
+ sourceResources: supplied.sourceResources.map(resource => ({uri: logical(resource.uri), file: sourceFile(resource.file),
75
+ ...(resource.canonicalUri === undefined ? {} : {canonicalUri: logical(resource.canonicalUri)})})),
76
+ ...(supplied.namespaceLocations ? {namespaceLocations: supplied.namespaceLocations.map(location => ({...location, location: logical(location.location)}))} : {}),
77
+ ...(supplied.recordSources ? {recordSources: supplied.recordSources.map(record => ({...record, source: sourceFile(record.source)}))} : {}),
78
+ };
79
+ }
80
+
81
+ /** Builds the host without listening or dispatching SOAP.
82
+ * @param supplied Optional overrides, restrictions, or complete advanced source configuration.
83
+ * @returns A ready Fastify host; physical native qualification remains an invocation duty.
84
+ * @throws For unknown controls, conflicting/incomplete source configuration or mismatched artifacts.
85
+ */
86
+ export async function buildServer(supplied: CheckedGatewayConfig = {}) {
87
+ const supported = ['localSource', 'fileRoots', 'endpoint', 'allowedEndpoints', 'capsuleFiles', 'sourceResources', 'sourceOrigins',
88
+ 'sourceUri', 'namespaceLocations', 'standardLibraries', 'recordSources', 'caFile', 'host', 'port', 'timeoutMs', 'limits', 'capabilities', 'signal'];
89
+ if (!supplied || typeof supplied !== 'object' || types.isProxy(supplied)
90
+ || ![null, Object.prototype].includes(Object.getPrototypeOf(supplied) as object | null)
91
+ || Reflect.ownKeys(supplied).some(key => typeof key !== 'string' || !supported.includes(key)
92
+ || !Object.hasOwn(Object.getOwnPropertyDescriptor(supplied, key)!, 'value')))
93
+ throw new Error('Unsupported checked gateway configuration field');
94
+ const advanced = ['localSource', 'sourceUri', 'namespaceLocations', 'recordSources', 'capsuleFiles'].some(key => Object.hasOwn(supplied, key));
95
+ if (advanced && ['localSource', 'fileRoots', 'sourceResources', 'sourceOrigins'].some(key => !Object.hasOwn(supplied, key)))
96
+ throw new Error('Conflicting or incomplete advanced source configuration; supply localSource, fileRoots, sourceResources and sourceOrigins together');
97
+ const config = (advanced ? {...supplied} : {...generatedSources(), ...supplied}) as SourceConfig;
98
+ if (typeof config.localSource !== 'string' || !Array.isArray(config.fileRoots) || !config.fileRoots.length
99
+ || !config.fileRoots.every(root => typeof root === 'string') || !Array.isArray(config.sourceResources) || !Array.isArray(config.sourceOrigins)
100
+ || config.endpoint !== undefined && typeof config.endpoint !== 'string'
101
+ || config.allowedEndpoints !== undefined && (!Array.isArray(config.allowedEndpoints) || !config.allowedEndpoints.every(endpoint => typeof endpoint === 'string')))
102
+ throw new Error('Explicit source configuration and valid endpoint restrictions are required');
103
+ const allowed = config.allowedEndpoints === undefined ? undefined : new Set(config.allowedEndpoints.map(endpoint => new URL(endpoint).href));
104
+ const capsules = Object.fromEntries(Object.entries(config.capsuleFiles ?? defaultCapsules)
105
+ .map(([name, file]) => [name, fs.readFileSync(path.resolve(projectRoot, file))]));
106
+ const selected = JSON.parse(selection) as {service: {namespace: string; local: string}; port: string};
107
+ const clientOptions: Options = {
108
+ localSource: config.localSource, fileRoots: config.fileRoots, sourceResources: config.sourceResources, sourceOrigins: config.sourceOrigins,
109
+ ...(config.sourceUri === undefined ? {} : {sourceUri: config.sourceUri}),
110
+ ...(config.namespaceLocations ? {namespaceLocations: config.namespaceLocations} : {}),
111
+ ...(config.standardLibraries ? {standardLibraries: config.standardLibraries} : {}),
112
+ ...(config.recordSources ? {recordSources: config.recordSources} : {}),
113
+ soap: {service: selected.service, port: selected.port,
114
+ ...(config.endpoint === undefined ? {} : {endpoint: config.endpoint}),
115
+ ...(allowed === undefined ? {} : {allowEndpoint: (endpoint: URL) => allowed.has(endpoint.href)}),
116
+ ...(config.signal ? {signal: config.signal} : {}), ...(config.timeoutMs === undefined ? {} : {timeoutMs: config.timeoutMs}),
117
+ ...(config.limits === undefined ? {} : {limits: config.limits}), ...(config.capabilities === undefined ? {} : {capabilities: config.capabilities}),
118
+ ...(config.caFile === undefined ? {} : {ca: fs.readFileSync(config.caFile, 'utf8')}),
119
+ },
120
+ };
121
+ const app = Fastify({logger: false});
122
+ try {
123
+ const openapi: unknown = JSON.parse(fs.readFileSync(path.resolve(projectRoot, __OPENAPI_FILE__), 'utf8'));
124
+ if (JSON.stringify(openapi) !== expectedOpenApiJson) throw new Error('incompatible-artifact: mixed checked OpenAPI and gateway; regenerate together');
125
+ app.get('/health', async () => ({status: 'ok'}));
126
+ app.get('/openapi.json', async () => openapi);
127
+ await app.register(gateway, {clientOptions, capsules});
128
+ await app.ready(); return app;
129
+ } catch (error) {await app.close(); throw error;}
130
+ }
131
+
132
+ async function start(): Promise<void> {
133
+ const file = process.env.CHECKED_GATEWAY_CONFIG;
134
+ const absolute = file === undefined ? undefined : path.resolve(file);
135
+ const supplied = absolute === undefined ? {} : JSON.parse(fs.readFileSync(absolute, 'utf8')) as CheckedGatewayConfig;
136
+ const base = absolute === undefined ? projectRoot : path.dirname(absolute);
137
+ const uri = (value: string) => /^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) ? value : pathToFileURL(path.resolve(base, value)).href;
138
+ const config: CheckedGatewayConfig = {...supplied,
139
+ ...(supplied.localSource === undefined ? {} : {localSource: path.resolve(base, supplied.localSource)}),
140
+ ...(supplied.fileRoots === undefined ? {} : {fileRoots: supplied.fileRoots.map(root => path.resolve(base, root))}),
141
+ ...(supplied.sourceResources === undefined ? {} : {sourceResources: supplied.sourceResources.map(resource => ({uri: uri(resource.uri),
142
+ file: path.resolve(base, resource.file), ...(resource.canonicalUri === undefined ? {} : {canonicalUri: uri(resource.canonicalUri)})}))}),
143
+ ...(supplied.namespaceLocations ? {namespaceLocations: supplied.namespaceLocations.map(location => ({...location, location: uri(location.location)}))} : {}),
144
+ ...(supplied.recordSources ? {recordSources: supplied.recordSources.map(record => ({...record, source: path.resolve(base, record.source)}))} : {}),
145
+ ...(supplied.caFile ? {caFile: path.resolve(base, supplied.caFile)} : {}),
146
+ ...(supplied.capsuleFiles ? {capsuleFiles: Object.fromEntries(Object.entries(supplied.capsuleFiles).map(([name, file]) => [name, path.resolve(base, file)]))} : {}),
147
+ };
148
+ const app = await buildServer(config);
149
+ process.once('SIGINT', () => {void app.close();});
150
+ process.once('SIGTERM', () => {void app.close();});
151
+ const address = await app.listen({host: config.host ?? __DEFAULT_HOST__, port: config.port ?? __DEFAULT_PORT__});
152
+ console.log('CHECKED_GATEWAY_LISTENING ' + address);
153
+ }
154
+
155
+ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
156
+ start().catch(error => {console.error(error); process.exitCode = 1;});
157
+ }
@@ -1,11 +1,18 @@
1
1
 
2
2
  /**
3
- * Streaming transport for operations flagged with a stream configuration.
4
- *
5
- * node-soap buffers the full response before invoking the operation callback
6
- * (verified empirically in ADR-002 / phase-0 research), so this method
7
- * bypasses node-soap and POSTs a hand-built SOAP envelope directly, then
8
- * pipes the response body through the SAX-driven record parser.
3
+ * Stream complete SOAP records through the legacy DTO mapper.
4
+ * @param args - Flat request DTO, serialized using the generated metadata.
5
+ * @param operation - SOAP operation name for diagnostics.
6
+ * @param requestType - Request metadata key.
7
+ * @param recordTypeName - Record metadata key, including companion catalog types.
8
+ * @param inputElementLocal - SOAP body element local name.
9
+ * @param inputElementNs - SOAP body element namespace.
10
+ * @param soapAction - SOAP 1.1 action.
11
+ * @param recordPath - Local-name path to repeated records.
12
+ * @param callOptions - Cancellation and total response deadline.
13
+ * @returns Single-pass records; callers must exhaust or return their iterator to release the connection.
14
+ * @throws Error for unsupported transport settings, HTTP errors, XML faults, or invalid mapped values.
15
+ * @constraints Streaming supports SOAP 1.1 document/literal requests, static SOAP headers, and ISecurity hooks.
9
16
  */
10
17
  protected async callStream<RequestType, RecordType, HeadersType>(
11
18
  args: RequestType,
@@ -15,169 +22,170 @@
15
22
  inputElementLocal: string,
16
23
  inputElementNs: string,
17
24
  soapAction: string,
18
- recordPath: string[]
25
+ recordPath: string[],
26
+ callOptions?: StreamCallOptions
19
27
  ): Promise<StreamOperationResponse<RecordType, HeadersType>> {
28
+ callOptions?.signal?.throwIfAborted();
20
29
  const client = await this.soapClient();
21
- const endpoint = this.resolveStreamEndpoint(client);
22
- const envelope = this.buildSoapEnvelope(args, operation, requestType, inputElementLocal, inputElementNs);
23
- const res = await fetch(endpoint, {
24
- method: "POST",
25
- headers: {
26
- "content-type": "text/xml; charset=utf-8",
27
- "soapaction": '"' + soapAction + '"',
28
- },
29
- body: envelope,
30
- });
31
- if (!res.ok) {
32
- throw new Error(
33
- operation + " stream request failed: " + res.status + " " + res.statusText
34
- );
30
+ const soapOptions = client.wsdl.options;
31
+ if (soapOptions.forceSoap12Headers || soapOptions.envelopeSoapUrl && soapOptions.envelopeSoapUrl !== "http://schemas.xmlsoap.org/soap/envelope/") {
32
+ throw new Error("Streaming supports SOAP 1.1 only");
35
33
  }
36
- if (!res.body) {
37
- throw new Error(operation + " stream request returned an empty response body");
34
+ const envelopeKey = soapOptions.envelopeKey ?? "soap";
35
+ if (!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(envelopeKey) || envelopeKey === "xml" || envelopeKey === "xmlns") {
36
+ throw new Error("Streaming requires a supported XML envelope prefix");
38
37
  }
39
- const headers: Record<string, string> = {};
40
- res.headers.forEach((value, key) => { headers[key] = value; });
41
- const spec: RecordParseSpec = {
42
- recordPath,
43
- recordTypeName,
44
- attributesKey: this.attributesKeyOut,
45
- childType: this.dataTypes?.ChildrenTypes,
38
+ const soapHeaders = client.getSoapHeaders() ?? [];
39
+ if (soapHeaders.some(header => typeof header !== "string")) {
40
+ throw new Error("Streaming requires static XML SOAP headers");
41
+ }
42
+ if (client.getBodyAttributes()?.length) {
43
+ throw new Error("Streaming does not support SOAP body attributes");
44
+ }
45
+ const transport = this.options?.httpClient ?? new __SOAP_HTTP_CLIENT__(this.options);
46
+ if (!transport.requestStream) throw new Error("Configured SOAP HTTP client does not support requestStream");
47
+ const security = (client as unknown as {security?: __SOAP_SECURITY__}).security ?? this.security;
48
+ const {endpoint, input} = this.resolveStreamBinding(client, operation, soapAction, inputElementLocal, inputElementNs);
49
+ const headers: Record<string, string> = {
50
+ "Content-Type": "text/xml; charset=utf-8",
51
+ SOAPAction: '"' + soapAction + '"',
46
52
  };
47
- const records = parseRecords<RecordType>(
48
- this.webStreamToAsyncIterable(res.body),
49
- spec
50
- );
51
- return {
52
- records,
53
- headers: headers as unknown as HeadersType,
54
- requestRaw: envelope,
53
+ const requestOptions: __SOAP_EX_OPTIONS__ = {...this.streamRequestOptions};
54
+ security?.addHeaders?.(headers);
55
+ security?.addOptions?.(requestOptions);
56
+ Object.assign(headers, client.getHttpHeaders());
57
+ if (requestOptions.forceMTOM || requestOptions.attachments?.length || requestOptions.ntlm) {
58
+ throw new Error("Streaming does not support MTOM attachments or NTLM transport");
59
+ }
60
+ // @why node-soap's schema serializer retains element qualification and foreign references that DTO type metadata omits.
61
+ const soapArgs = this.toSoapArgs(args, requestType);
62
+ const message = client.wsdl.objectToDocumentXML(input.$name, soapArgs, input.targetNSAlias, input.targetNamespace, input.$type || input.$lookupType, requestOptions);
63
+ let envelope = this.buildSoapEnvelope(message, envelopeKey, client);
64
+ const headerXml = soapHeaders.join(" ") + (security?.postProcess ? "" : security?.toXML?.() ?? "");
65
+ if (headerXml || security?.postProcess) {
66
+ const body = "<" + envelopeKey + ":Body>";
67
+ const headerNamespaces = client.wsdl.xmlnsInHeader ? " " + client.wsdl.xmlnsInHeader : "";
68
+ envelope = envelope.replace(body, "<" + envelopeKey + ":Header" + headerNamespaces + ">" + headerXml + "</" + envelopeKey + ":Header>" + body);
69
+ }
70
+ if (security?.postProcess) envelope = security.postProcess(envelope, envelopeKey);
71
+ if (typeof requestOptions.postProcess === "function") envelope = requestOptions.postProcess(envelope);
72
+ const controller = new AbortController();
73
+ const signals = [controller.signal, callOptions?.signal, requestOptions.signal].filter((signal): signal is AbortSignal => !!signal);
74
+ requestOptions.signal = AbortSignal.any(signals);
75
+ const timeoutMs = callOptions?.timeoutMs;
76
+ if (timeoutMs !== undefined && (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647)) {
77
+ throw new RangeError("Stream timeoutMs must be a positive safe timer duration");
78
+ }
79
+ const timer = timeoutMs === undefined ? undefined : setTimeout(() => controller.abort(new Error("Stream request timed out")), timeoutMs);
80
+ timer?.unref();
81
+ let body: (AsyncIterable<string | Uint8Array> & {destroy(): void}) | undefined;
82
+ const cleanup = () => {
83
+ if (timer) clearTimeout(timer);
84
+ if (typeof body?.destroy === "function") body.destroy();
85
+ controller.abort();
55
86
  };
87
+ try {
88
+ const res = await transport.requestStream(endpoint, envelope, headers, requestOptions, client);
89
+ body = res.data as unknown as typeof body;
90
+ if (!body || typeof body[Symbol.asyncIterator] !== "function" || typeof body.destroy !== "function") {
91
+ throw new Error(operation + " stream request returned an invalid response body");
92
+ }
93
+ if (res.status < 200 || res.status >= 300) {
94
+ throw new Error(operation + " stream request failed: " + res.status + " " + res.statusText);
95
+ }
96
+ const spec: RecordParseSpec = {
97
+ recordPath,
98
+ recordTypeName,
99
+ attributesKey: this.attributesKeyOut,
100
+ childType: this.dataTypes?.ChildrenTypes,
101
+ repeatedElements: this.dataTypes?.RepeatedElements,
102
+ };
103
+ const source = parseRecords(body, spec);
104
+ const self = this;
105
+ async function* mapped(): AsyncGenerator<RecordType> {
106
+ try {
107
+ for await (const record of source) yield self.fromSoapResult(record, recordTypeName) as RecordType;
108
+ } finally { cleanup(); }
109
+ }
110
+ const iterator = mapped();
111
+ // @constraints return() must close transport even before the generator's first next().
112
+ const records: AsyncIterable<RecordType> = {
113
+ [Symbol.asyncIterator]() {
114
+ return {
115
+ next: () => iterator.next(),
116
+ return: async () => { cleanup(); return iterator.return(undefined); },
117
+ throw: async error => { cleanup(); return iterator.throw(error); },
118
+ };
119
+ },
120
+ };
121
+ return {records, headers: res.headers as unknown as HeadersType, requestRaw: envelope};
122
+ } catch (error) {
123
+ cleanup();
124
+ throw error;
125
+ }
56
126
  }
57
127
 
58
128
  /**
59
- * Walk the node-soap WSDL descriptor to locate the first service port's
60
- * SOAP address. Falls back to the \`source\` URL when the descriptor is
61
- * unavailable (e.g., \`source\` was given as a direct endpoint URL).
129
+ * Select one compatible live document/literal operation binding and endpoint.
130
+ * @param client - Initialized node-soap client.
131
+ * @param operation - Compiled operation name.
132
+ * @param soapAction - Compiled SOAP action, used to disambiguate live methods.
133
+ * @param inputElementLocal - Expected input element local name.
134
+ * @param inputElementNs - Expected input namespace.
135
+ * @returns Matched input descriptor and current override or owning port address.
136
+ * @throws Error for missing, ambiguous, or incompatible live operation bindings.
137
+ * @constraints Distinct bindings cannot be assumed equivalent after node-soap has processed shared port-type metadata.
62
138
  */
63
- protected resolveStreamEndpoint(client: __SOAP_CLIENT_TYPE__): string {
139
+ protected resolveStreamBinding(
140
+ client: __SOAP_CLIENT_TYPE__,
141
+ operation: string,
142
+ soapAction: string,
143
+ inputElementLocal: string,
144
+ inputElementNs: string
145
+ ): {endpoint: string; input: {$name: string; targetNSAlias: string; targetNamespace: string; $type?: string; $lookupType?: string}} {
146
+ const override = (client as unknown as {endpoint?: string}).endpoint ?? this.options?.endpoint;
147
+ const candidates: Array<{endpoint: string; binding: unknown; method: any}> = [];
64
148
  const services = (client as any)?.wsdl?.definitions?.services ?? {};
65
149
  for (const svc of Object.values(services)) {
66
150
  const ports = (svc as any)?.ports ?? {};
67
151
  for (const port of Object.values(ports)) {
68
- const location = (port as any)?.location;
69
- if (typeof location === "string" && location) return location;
152
+ const binding = (port as any)?.binding;
153
+ const method = binding?.methods?.[operation];
154
+ if (!method || method.$name !== operation || (method.soapAction ?? "") !== soapAction) continue;
155
+ const endpoint = override || (port as any)?.location;
156
+ if (typeof endpoint !== "string" || !endpoint) throw new Error("No SOAP endpoint configured for stream request");
157
+ candidates.push({endpoint, binding, method});
70
158
  }
71
159
  }
72
- return this.source;
160
+ if (candidates.length === 0) throw new Error("No matching SOAP operation binding for stream request: " + operation);
161
+ const selected = candidates[0];
162
+ if (candidates.some(candidate => candidate.binding !== selected.binding || candidate.method !== selected.method || candidate.endpoint !== selected.endpoint)) {
163
+ throw new Error("Ambiguous or incompatible SOAP operation bindings for stream request: " + operation);
164
+ }
165
+ const method = selected.method;
166
+ const input = method.input;
167
+ if (method.style && method.style !== "document" || method.inputSoap?.use && method.inputSoap.use !== "literal" ||
168
+ !input || input.parts || input.$name !== inputElementLocal || input.targetNamespace !== inputElementNs) {
169
+ throw new Error("Incompatible SOAP document/literal input binding for stream request: " + operation);
170
+ }
171
+ return {endpoint: selected.endpoint, input};
73
172
  }
74
173
 
75
174
  /**
76
- * Build a SOAP 1.1 envelope around the operation's input element. Uses the
77
- * existing attributes / children metadata so attribute bags render as XML
78
- * attributes and child properties render as nested elements.
175
+ * Wrap the schema-serialized request using the initialized client's envelope namespace context.
176
+ * @param body - Document/literal XML from node-soap's public WSDL serializer.
177
+ * @param envelopeKey - Validated SOAP envelope prefix, also passed to security processing.
178
+ * @param client - Initialized client supplying the WSDL namespace declarations.
179
+ * @returns A SOAP 1.1 envelope ready for static headers and security hooks.
79
180
  */
80
181
  protected buildSoapEnvelope(
81
- args: unknown,
82
- operation: string,
83
- requestType: string | undefined,
84
- inputElementLocal: string,
85
- inputElementNs: string
182
+ body: string,
183
+ envelopeKey: string,
184
+ client: __SOAP_CLIENT_TYPE__
86
185
  ): string {
87
- const body = this.toXmlElement(args, requestType, inputElementLocal, inputElementNs);
88
186
  return '<?xml version="1.0" encoding="utf-8"?>' +
89
- '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
90
- '<soap:Body>' + body + '</soap:Body>' +
91
- '</soap:Envelope>';
92
- }
93
-
94
- /**
95
- * Serialize a value as a single XML element. The element namespace is only
96
- * emitted when \`namespace\` is provided (i.e., the envelope's top-level body
97
- * element). Nested elements inherit the namespace via XML scoping.
98
- */
99
- protected toXmlElement(
100
- value: unknown,
101
- typeName: string | undefined,
102
- elementName: string,
103
- namespace?: string
104
- ): string {
105
- const nsAttr = namespace ? ' xmlns="' + this.escapeXml(namespace) + '"' : "";
106
- if (value === null || value === undefined) {
107
- return '<' + elementName + nsAttr +
108
- ' xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>';
109
- }
110
- if (typeof value !== "object") {
111
- return '<' + elementName + nsAttr + '>' + this.escapeXml(String(value)) + '</' + elementName + '>';
112
- }
113
- if (Array.isArray(value)) {
114
- return value.map((v) => this.toXmlElement(v, typeName, elementName, namespace)).join("");
115
- }
116
- const obj = value as Record<string, unknown>;
117
- const attributesList = (typeName && this.dataTypes?.Attributes?.[typeName]) || [];
118
- const childrenTypes = (typeName && this.dataTypes?.ChildrenTypes?.[typeName]) || {};
119
- const attrPairs: Array<[string, string]> = [];
120
- const bagIn = (obj as any)[this.attributesKeyIn] ?? (obj as any)["attributes"];
121
- if (bagIn && typeof bagIn === "object") {
122
- for (const [k, v] of Object.entries(bagIn)) attrPairs.push([k, this.normalizeAttr(v)]);
123
- }
124
- const childParts: string[] = [];
125
- let textContent: string | undefined;
126
- if ("$value" in obj) textContent = String(obj.$value ?? "");
127
- for (const [k, v] of Object.entries(obj)) {
128
- if (k === "$value" || k === this.attributesKeyIn || k === "attributes") continue;
129
- if ((attributesList as readonly string[]).includes(k)) {
130
- attrPairs.push([k, this.normalizeAttr(v)]);
131
- continue;
132
- }
133
- const childTypeRaw = (childrenTypes as Record<string, string>)[k];
134
- const childType = childTypeRaw?.endsWith("[]") ? childTypeRaw.slice(0, -2) : childTypeRaw;
135
- if (Array.isArray(v)) {
136
- for (const item of v) childParts.push(this.toXmlElement(item, childType, k));
137
- } else {
138
- childParts.push(this.toXmlElement(v, childType, k));
139
- }
140
- }
141
- const attrStr = attrPairs.map(([k, val]) => ' ' + k + '="' + this.escapeXml(val) + '"').join("");
142
- if (childParts.length === 0 && textContent === undefined) {
143
- return '<' + elementName + nsAttr + attrStr + '/>';
144
- }
145
- const inner = childParts.join("") + (textContent !== undefined ? this.escapeXml(textContent) : "");
146
- return '<' + elementName + nsAttr + attrStr + '>' + inner + '</' + elementName + '>';
147
- }
148
-
149
- protected normalizeAttr(v: unknown): string {
150
- if (v === null || v === undefined) return "";
151
- if (typeof v === "boolean") return v ? "true" : "false";
152
- if (typeof v === "number") return Number.isFinite(v) ? String(v) : "";
153
- return String(v);
154
- }
155
-
156
- protected escapeXml(s: string): string {
157
- return s
158
- .replace(/&/g, "&amp;")
159
- .replace(/</g, "&lt;")
160
- .replace(/>/g, "&gt;")
161
- .replace(/"/g, "&quot;")
162
- .replace(/'/g, "&apos;");
163
- }
164
-
165
- /**
166
- * Iterate an uploaded web ReadableStream as Uint8Array chunks. Node 24+
167
- * ReadableStream implements Symbol.asyncIterator natively; this helper
168
- * normalizes the types so TypeScript can drive it through \`for await\`.
169
- */
170
- protected async *webStreamToAsyncIterable(
171
- body: ReadableStream<Uint8Array>
172
- ): AsyncIterable<Uint8Array> {
173
- const reader = body.getReader();
174
- try {
175
- while (true) {
176
- const {value, done} = await reader.read();
177
- if (done) return;
178
- if (value) yield value;
179
- }
180
- } finally {
181
- try { reader.releaseLock(); } catch { /* noop */ }
182
- }
187
+ '<' + envelopeKey + ':Envelope xmlns:' + envelopeKey + '="http://schemas.xmlsoap.org/soap/envelope/" ' +
188
+ 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + client.wsdl.xmlnsInEnvelope + '>' +
189
+ '<' + envelopeKey + ':Body>' + body + '</' + envelopeKey + ':Body>' +
190
+ '</' + envelopeKey + ':Envelope>';
183
191
  }
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Response shape for streaming __CLIENT_NAME__ operations. `records` is a
3
- * single-pass async iterable of parsed record objects; iteration pulls bytes
4
- * from the upstream SOAP response on demand. `headers` is the HTTP response
5
- * header map captured before the first record is parsed. `requestRaw`, when
6
- * populated, contains the serialized SOAP envelope that was sent upstream.
2
+ * Represents a streamed __CLIENT_NAME__ response.
3
+ * @typeParam RecordType Parsed record DTO yielded by the single-pass upstream iterator.
4
+ * @typeParam HeadersType HTTP headers captured before the first record is parsed.
5
+ * @constraints The structural default permits WSDL DTOs named Record without shadowing a utility type.
6
+ * @remarks requestRaw contains the serialized SOAP request when populated.
7
7
  */
8
- export type StreamOperationResponse<RecordType, HeadersType = Record<string, unknown>> = {
8
+ export type StreamOperationResponse<RecordType, HeadersType = {[key: string]: unknown}> = {
9
9
  records: AsyncIterable<RecordType>;
10
10
  headers: HeadersType;
11
11
  requestRaw?: string;