@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.
- package/README.md +80 -68
- package/dist/app/generateApp.d.ts +0 -1
- package/dist/app/generateApp.js +1 -1
- package/dist/app/generateCheckedApp.d.ts +38 -0
- package/dist/app/generateCheckedApp.js +108 -0
- package/dist/checkedPipeline.d.ts +155 -0
- package/dist/checkedPipeline.js +448 -0
- package/dist/checkedPlanning.d.ts +123 -0
- package/dist/checkedPlanning.js +268 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +92 -2
- package/dist/client/checkedDirectRuntime.d.ts +40 -3
- package/dist/client/checkedDirectRuntime.js +28 -8
- package/dist/client/directClientRuntime.d.ts +27 -2
- package/dist/client/directClientRuntime.js +142 -89
- package/dist/client/directClientVersion.d.ts +3 -1
- package/dist/client/directClientVersion.js +3 -0
- package/dist/client/generateClient.d.ts +0 -1
- package/dist/client/generateClient.js +98 -28
- package/dist/client/generateDirectClient.d.ts +21 -3
- package/dist/client/generateDirectClient.js +138 -6
- package/dist/client/generateOperations.d.ts +0 -1
- package/dist/client/generateOperations.js +30 -11
- package/dist/client/generateTypes.d.ts +0 -1
- package/dist/client/generateUtils.d.ts +0 -1
- package/dist/client/generateUtils.js +7 -1
- package/dist/compiler/applicationGroups.d.ts +53 -0
- package/dist/compiler/applicationGroups.js +403 -0
- package/dist/compiler/buildCanonicalGraph.d.ts +0 -1
- package/dist/compiler/canonicalGraph.d.ts +4 -16
- package/dist/compiler/canonicalGraph.js +1 -8
- package/dist/compiler/catalogErrors.d.ts +0 -1
- package/dist/compiler/catalogProvenance.d.ts +0 -1
- package/dist/compiler/checkedAssessment.d.ts +0 -1
- package/dist/compiler/checkedAssessment.js +1 -1
- package/dist/compiler/checkedComponentSource.d.ts +16 -0
- package/dist/compiler/checkedComponentSource.js +31 -0
- package/dist/compiler/checkedSourcePreparation.d.ts +38 -1
- package/dist/compiler/checkedSourcePreparation.js +71 -0
- package/dist/compiler/complexTypeContent.d.ts +5 -6
- package/dist/compiler/complexTypeContent.js +2 -2
- package/dist/compiler/componentCorrespondence.d.ts +32 -0
- package/dist/compiler/componentCorrespondence.js +140 -0
- package/dist/compiler/componentRecordProjection.d.ts +112 -0
- package/dist/compiler/componentRecordProjection.js +329 -0
- package/dist/compiler/componentSoapPreparation.d.ts +20 -0
- package/dist/compiler/componentSoapPreparation.js +36 -0
- package/dist/compiler/composeCanonicalGraph.d.ts +0 -1
- package/dist/compiler/dataOwnership.d.ts +0 -1
- package/dist/compiler/dataOwnership.js +14 -4
- package/dist/compiler/datatypeValues.d.ts +0 -1
- package/dist/compiler/declarationIdentity.d.ts +22 -0
- package/dist/compiler/declarationIdentity.js +9 -0
- package/dist/compiler/directCodec.d.ts +79 -2
- package/dist/compiler/directCodec.js +310 -92
- package/dist/compiler/directExecutionPolicy.d.ts +0 -1
- package/dist/compiler/directOperation.d.ts +72 -8
- package/dist/compiler/directOperation.js +164 -19
- package/dist/compiler/directSoap.d.ts +29 -5
- package/dist/compiler/directSoap.js +154 -44
- package/dist/compiler/directSoapSource.d.ts +24 -1
- package/dist/compiler/directSoapSource.js +166 -19
- package/dist/compiler/directSourceCapsule.d.ts +74 -2
- package/dist/compiler/directSourceCapsule.js +484 -6
- package/dist/compiler/directStructure.d.ts +83 -6
- package/dist/compiler/directStructure.js +353 -58
- package/dist/compiler/directStructurePlan.d.ts +144 -2
- package/dist/compiler/directStructurePlan.js +615 -30
- package/dist/compiler/directValues.d.ts +76 -5
- package/dist/compiler/directValues.js +967 -117
- package/dist/compiler/finiteRe01Construction.d.ts +69 -0
- package/dist/compiler/finiteRe01Construction.js +422 -0
- package/dist/compiler/finiteRe01Verification.d.ts +81 -3
- package/dist/compiler/finiteRe01Verification.js +391 -4
- package/dist/compiler/generateCatalog.d.ts +0 -1
- package/dist/compiler/graphTraversal.d.ts +0 -1
- package/dist/compiler/hypotheticalScopedIdentity.d.ts +0 -1
- package/dist/compiler/legacyDeclarations.d.ts +26 -0
- package/dist/compiler/legacyDeclarations.js +144 -0
- package/dist/compiler/occurrenceAnalysis.d.ts +2 -1
- package/dist/compiler/occurrenceAnalysis.js +23 -7
- package/dist/compiler/originalSourceMembership.d.ts +0 -1
- package/dist/compiler/particleAttribution.d.ts +0 -1
- package/dist/compiler/particleAttribution.js +20 -0
- package/dist/compiler/particleDeclarationConsistency.d.ts +0 -1
- package/dist/compiler/particleDeclarationConsistency.js +9 -0
- package/dist/compiler/particleExtension.d.ts +0 -1
- package/dist/compiler/particleExtension.js +5 -1
- package/dist/compiler/particleLocalAssessment.d.ts +0 -1
- package/dist/compiler/particleRestriction.d.ts +0 -1
- package/dist/compiler/particleRestriction.js +6 -1
- package/dist/compiler/particleSemanticView.d.ts +2 -1
- package/dist/compiler/particleSemanticView.js +16 -3
- package/dist/compiler/particleWildcardRelation.d.ts +0 -1
- package/dist/compiler/projectionScalar.d.ts +49 -0
- package/dist/compiler/projectionScalar.js +218 -0
- package/dist/compiler/re01CandidateAssignments.d.ts +95 -0
- package/dist/compiler/re01CandidateAssignments.js +341 -0
- package/dist/compiler/re01CandidateCorrespondence.d.ts +22 -1
- package/dist/compiler/re01CandidateCorrespondence.js +167 -38
- package/dist/compiler/re01TypeProperties.d.ts +0 -1
- package/dist/compiler/re01TypePropertyValidation.d.ts +0 -1
- package/dist/compiler/resolveCanonicalGraph.d.ts +5 -2
- package/dist/compiler/resolveCanonicalGraph.js +77 -7
- package/dist/compiler/rpcStringValues.d.ts +30 -0
- package/dist/compiler/rpcStringValues.js +196 -0
- package/dist/compiler/rpcTypedValues.d.ts +48 -0
- package/dist/compiler/rpcTypedValues.js +190 -0
- package/dist/compiler/scalarSchemaAssessment.d.ts +0 -1
- package/dist/compiler/schemaAttributeGroupProperties.d.ts +0 -1
- package/dist/compiler/schemaAttributeProperties.d.ts +0 -1
- package/dist/compiler/schemaAttributeUses.d.ts +22 -2
- package/dist/compiler/schemaAttributeUses.js +86 -13
- package/dist/compiler/schemaBinaryWordReconstruction.d.ts +0 -1
- package/dist/compiler/schemaBuiltinFacets.d.ts +0 -1
- package/dist/compiler/schemaCalendarImages.d.ts +0 -1
- package/dist/compiler/schemaCalendarLanguage.d.ts +0 -1
- package/dist/compiler/schemaCompiler.d.ts +0 -1
- package/dist/compiler/schemaCompiler.js +44 -109
- package/dist/compiler/schemaComponentEquality.d.ts +0 -1
- package/dist/compiler/schemaConstructionAssessment.d.ts +34 -1
- package/dist/compiler/schemaConstructionAssessment.js +88 -6
- package/dist/compiler/schemaDatatypeValues.d.ts +0 -1
- package/dist/compiler/schemaDecimalLanguage.d.ts +0 -1
- package/dist/compiler/schemaDeclarationPrimitives.d.ts +7 -2
- package/dist/compiler/schemaDeclarationPrimitives.js +18 -1
- package/dist/compiler/schemaDocumentSyntax.d.ts +0 -1
- package/dist/compiler/schemaDurationLanguage.d.ts +0 -1
- package/dist/compiler/schemaElementInstance.d.ts +30 -0
- package/dist/compiler/schemaElementInstance.js +45 -0
- package/dist/compiler/schemaElementProperties.d.ts +0 -1
- package/dist/compiler/schemaEndpointWordCapacity.d.ts +0 -1
- package/dist/compiler/schemaExactCalendar.d.ts +0 -1
- package/dist/compiler/schemaFacetAnnotation.d.ts +0 -1
- package/dist/compiler/schemaGeneratedScalarShape.d.ts +0 -1
- package/dist/compiler/schemaGeneratedScalarShape.js +2 -0
- package/dist/compiler/schemaIdentityConstraints.d.ts +0 -1
- package/dist/compiler/schemaIeeeLanguage.d.ts +0 -1
- package/dist/compiler/schemaIntegerImages.d.ts +0 -1
- package/dist/compiler/schemaLexicalPredicates.d.ts +0 -1
- package/dist/compiler/schemaNotationProperties.d.ts +0 -1
- package/dist/compiler/schemaNumericImageConditions.d.ts +0 -1
- package/dist/compiler/schemaParticleWildcardProperties.d.ts +0 -1
- package/dist/compiler/schemaPattern.d.ts +0 -1
- package/dist/compiler/schemaRegularLanguage.d.ts +0 -1
- package/dist/compiler/schemaScalarContext.d.ts +5 -1
- package/dist/compiler/schemaScalarKernel.d.ts +0 -1
- package/dist/compiler/schemaScalarWitnesses.d.ts +0 -1
- package/dist/compiler/schemaSimpleTypeProperties.d.ts +0 -1
- package/dist/compiler/schemaSourceGrammar.d.ts +0 -1
- package/dist/compiler/schemaSourceLexical.d.ts +0 -1
- package/dist/compiler/schemaSourceValues.d.ts +0 -1
- package/dist/compiler/schemaSourceWildcards.d.ts +1 -2
- package/dist/compiler/schemaSourceWildcards.js +3 -1
- package/dist/compiler/schemaSymbolicSequences.d.ts +0 -1
- package/dist/compiler/schemaSymbolicValueSets.d.ts +0 -1
- package/dist/compiler/schemaSyntaxAssessment.d.ts +0 -1
- package/dist/compiler/schemaTemporalAliases.d.ts +0 -1
- package/dist/compiler/schemaTokenImages.d.ts +0 -1
- package/dist/compiler/schemaTypeIdentity.d.ts +0 -1
- package/dist/compiler/schemaTypeIdentity.js +2 -0
- package/dist/compiler/schemaTypeRelations.d.ts +0 -1
- package/dist/compiler/schemaUri.d.ts +0 -1
- package/dist/compiler/schemaValueContext.d.ts +0 -1
- package/dist/compiler/schemaValueImages.d.ts +0 -1
- package/dist/compiler/schemaValueSequences.d.ts +0 -1
- package/dist/compiler/semanticBudget.d.ts +18 -1
- package/dist/compiler/semanticBudget.js +17 -2
- package/dist/compiler/semanticCatalog.d.ts +2 -3
- package/dist/compiler/semanticContext.d.ts +12 -1
- package/dist/compiler/semanticContext.js +39 -0
- package/dist/compiler/semanticTypeDependencies.d.ts +0 -1
- package/dist/compiler/semanticTypeReference.d.ts +0 -1
- package/dist/compiler/shapeResolver.d.ts +0 -1
- package/dist/compiler/soapHeaders.d.ts +16 -0
- package/dist/compiler/soapHeaders.js +42 -0
- package/dist/compiler/sourceSchemaBinding.d.ts +0 -1
- package/dist/compiler/standardSchemaComponents.d.ts +71 -0
- package/dist/compiler/standardSchemaComponents.js +74 -0
- package/dist/compiler/standardSchemaConstruction.d.ts +20 -0
- package/dist/compiler/standardSchemaConstruction.js +34 -0
- package/dist/compiler/structuralCompanions.d.ts +0 -1
- package/dist/compiler/validateSemanticGraph.d.ts +0 -1
- package/dist/compiler/wildcardAlgebra.d.ts +0 -1
- package/dist/compiler/wsdlPolicyRequirements.d.ts +43 -0
- package/dist/compiler/wsdlPolicyRequirements.js +239 -0
- package/dist/config.d.ts +0 -1
- package/dist/gateway/generateCheckedGateway.d.ts +32 -0
- package/dist/gateway/generateCheckedGateway.js +293 -0
- package/dist/gateway/generateComposedGateway.d.ts +16 -0
- package/dist/gateway/generateComposedGateway.js +65 -0
- package/dist/gateway/generateGateway.d.ts +0 -1
- package/dist/gateway/generateGateway.js +1 -0
- package/dist/gateway/generators.d.ts +0 -1
- package/dist/gateway/generators.js +19 -4
- package/dist/gateway/helpers.d.ts +1 -1
- package/dist/gateway/helpers.js +15 -0
- package/dist/generation/componentShape.d.ts +14 -0
- package/dist/generation/componentShape.js +293 -0
- package/dist/generation/preamble.d.ts +0 -1
- package/dist/generation/sourceLayout.d.ts +13 -0
- package/dist/generation/sourceLayout.js +40 -0
- package/dist/generation/writeGeneratedSource.d.ts +0 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.js +4 -1
- package/dist/loader/fetch.d.ts +0 -1
- package/dist/loader/orderedSyntax.d.ts +12 -1
- package/dist/loader/orderedSyntax.js +40 -6
- package/dist/loader/resolutionDepth.d.ts +0 -1
- package/dist/loader/schemaInput.d.ts +28 -1
- package/dist/loader/schemaInput.js +41 -4
- package/dist/loader/schemaResources.d.ts +2 -1
- package/dist/loader/schemaResources.js +45 -4
- package/dist/loader/wsdlLoader.d.ts +0 -1
- package/dist/multiServicePipeline.d.ts +41 -0
- package/dist/multiServicePipeline.js +287 -0
- package/dist/openapi/casing.d.ts +0 -1
- package/dist/openapi/composeOpenAPI.d.ts +29 -0
- package/dist/openapi/composeOpenAPI.js +322 -0
- package/dist/openapi/generateOpenAPI.d.ts +0 -1
- package/dist/openapi/generatePaths.d.ts +0 -1
- package/dist/openapi/generateSchemas.d.ts +0 -1
- package/dist/openapi/security.d.ts +0 -1
- package/dist/pipeline.d.ts +7 -3
- package/dist/pipeline.js +15 -0
- package/dist/test/generateCheckedTests.d.ts +17 -0
- package/dist/test/generateCheckedTests.js +60 -0
- package/dist/test/generateTests.d.ts +0 -1
- package/dist/test/generators.d.ts +0 -1
- package/dist/test/mockData.d.ts +0 -1
- package/dist/test/mockData.js +20 -14
- package/dist/util/attributeWildcards.d.ts +0 -1
- package/dist/util/builder.d.ts +0 -1
- package/dist/util/catalogMeta.d.ts +0 -1
- package/dist/util/checkedCliDiagnostics.d.ts +11 -0
- package/dist/util/checkedCliDiagnostics.js +22 -0
- package/dist/util/cli.d.ts +0 -1
- package/dist/util/errors.d.ts +0 -1
- package/dist/util/imports.d.ts +0 -1
- package/dist/util/runtimeSource.d.ts +0 -1
- package/dist/util/runtimeSource.js +3 -5
- package/dist/util/securityConfig.d.ts +0 -1
- package/dist/util/streamConfig.d.ts +0 -1
- package/dist/util/tools.d.ts +0 -1
- package/dist/util/xmlWhitespace.d.ts +0 -1
- package/dist/xsd/primitives.d.ts +0 -1
- package/docs/agent-skill.md +12 -1
- package/docs/api-reference.md +127 -9
- package/docs/checked-gateway.md +212 -0
- package/docs/checked-generation.md +167 -0
- package/docs/cli-reference.md +48 -6
- package/docs/concepts.md +139 -5
- package/docs/configuration.md +15 -4
- package/docs/corpus.md +33 -0
- package/docs/direct-values.md +13 -13
- package/docs/examples/checked-forecast.wsdl +19 -0
- package/docs/gateway-guide.md +104 -27
- package/docs/generated-code.md +22 -11
- package/docs/mapping-contract.md +114 -0
- package/docs/migration-playbook.md +5 -1
- package/docs/migration.md +124 -6
- package/docs/output-anatomy.md +21 -18
- package/docs/production.md +7 -5
- package/docs/start-here.md +19 -3
- package/docs/supported-patterns.md +24 -3
- package/docs/testing.md +119 -31
- package/docs/troubleshooting.md +3 -1
- package/llms.txt +16 -8
- package/package.json +64 -23
- package/src/runtime/checkedGatewayHost.tpl.txt +157 -0
- package/src/runtime/clientStreamMethods.tpl.txt +156 -148
- package/src/runtime/operationsStreamHelper.tpl.txt +6 -6
- package/src/runtime/streamXml.ts +49 -21
- package/dist/app/generateApp.d.ts.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/client/checkedDirectRuntime.d.ts.map +0 -1
- package/dist/client/directClientRuntime.d.ts.map +0 -1
- package/dist/client/directClientVersion.d.ts.map +0 -1
- package/dist/client/generateClient.d.ts.map +0 -1
- package/dist/client/generateDirectClient.d.ts.map +0 -1
- package/dist/client/generateOperations.d.ts.map +0 -1
- package/dist/client/generateTypes.d.ts.map +0 -1
- package/dist/client/generateUtils.d.ts.map +0 -1
- package/dist/compiler/buildCanonicalGraph.d.ts.map +0 -1
- package/dist/compiler/canonicalGraph.d.ts.map +0 -1
- package/dist/compiler/catalogErrors.d.ts.map +0 -1
- package/dist/compiler/catalogProvenance.d.ts.map +0 -1
- package/dist/compiler/checkedAssessment.d.ts.map +0 -1
- package/dist/compiler/checkedSourcePreparation.d.ts.map +0 -1
- package/dist/compiler/complexTypeContent.d.ts.map +0 -1
- package/dist/compiler/composeCanonicalGraph.d.ts.map +0 -1
- package/dist/compiler/dataOwnership.d.ts.map +0 -1
- package/dist/compiler/datatypeValues.d.ts.map +0 -1
- package/dist/compiler/directCodec.d.ts.map +0 -1
- package/dist/compiler/directExecutionPolicy.d.ts.map +0 -1
- package/dist/compiler/directOperation.d.ts.map +0 -1
- package/dist/compiler/directSoap.d.ts.map +0 -1
- package/dist/compiler/directSoapSource.d.ts.map +0 -1
- package/dist/compiler/directSourceCapsule.d.ts.map +0 -1
- package/dist/compiler/directStructure.d.ts.map +0 -1
- package/dist/compiler/directStructurePlan.d.ts.map +0 -1
- package/dist/compiler/directValues.d.ts.map +0 -1
- package/dist/compiler/finiteRe01Verification.d.ts.map +0 -1
- package/dist/compiler/generateCatalog.d.ts.map +0 -1
- package/dist/compiler/graphTraversal.d.ts.map +0 -1
- package/dist/compiler/hypotheticalScopedIdentity.d.ts.map +0 -1
- package/dist/compiler/occurrenceAnalysis.d.ts.map +0 -1
- package/dist/compiler/originalSourceMembership.d.ts.map +0 -1
- package/dist/compiler/particleAttribution.d.ts.map +0 -1
- package/dist/compiler/particleDeclarationConsistency.d.ts.map +0 -1
- package/dist/compiler/particleExtension.d.ts.map +0 -1
- package/dist/compiler/particleLocalAssessment.d.ts.map +0 -1
- package/dist/compiler/particleRestriction.d.ts.map +0 -1
- package/dist/compiler/particleSemanticView.d.ts.map +0 -1
- package/dist/compiler/particleWildcardRelation.d.ts.map +0 -1
- package/dist/compiler/re01CandidateCorrespondence.d.ts.map +0 -1
- package/dist/compiler/re01TypeProperties.d.ts.map +0 -1
- package/dist/compiler/re01TypePropertyValidation.d.ts.map +0 -1
- package/dist/compiler/resolveCanonicalGraph.d.ts.map +0 -1
- package/dist/compiler/scalarSchemaAssessment.d.ts.map +0 -1
- package/dist/compiler/schemaAttributeGroupProperties.d.ts.map +0 -1
- package/dist/compiler/schemaAttributeProperties.d.ts.map +0 -1
- package/dist/compiler/schemaAttributeUses.d.ts.map +0 -1
- package/dist/compiler/schemaBinaryWordReconstruction.d.ts.map +0 -1
- package/dist/compiler/schemaBuiltinFacets.d.ts.map +0 -1
- package/dist/compiler/schemaCalendarImages.d.ts.map +0 -1
- package/dist/compiler/schemaCalendarLanguage.d.ts.map +0 -1
- package/dist/compiler/schemaCompiler.d.ts.map +0 -1
- package/dist/compiler/schemaComponentEquality.d.ts.map +0 -1
- package/dist/compiler/schemaConstructionAssessment.d.ts.map +0 -1
- package/dist/compiler/schemaDatatypeValues.d.ts.map +0 -1
- package/dist/compiler/schemaDecimalLanguage.d.ts.map +0 -1
- package/dist/compiler/schemaDeclarationPrimitives.d.ts.map +0 -1
- package/dist/compiler/schemaDocumentSyntax.d.ts.map +0 -1
- package/dist/compiler/schemaDurationLanguage.d.ts.map +0 -1
- package/dist/compiler/schemaElementProperties.d.ts.map +0 -1
- package/dist/compiler/schemaEndpointWordCapacity.d.ts.map +0 -1
- package/dist/compiler/schemaExactCalendar.d.ts.map +0 -1
- package/dist/compiler/schemaFacetAnnotation.d.ts.map +0 -1
- package/dist/compiler/schemaGeneratedScalarShape.d.ts.map +0 -1
- package/dist/compiler/schemaIdentityConstraints.d.ts.map +0 -1
- package/dist/compiler/schemaIeeeLanguage.d.ts.map +0 -1
- package/dist/compiler/schemaIntegerImages.d.ts.map +0 -1
- package/dist/compiler/schemaLexicalPredicates.d.ts.map +0 -1
- package/dist/compiler/schemaNotationProperties.d.ts.map +0 -1
- package/dist/compiler/schemaNumericImageConditions.d.ts.map +0 -1
- package/dist/compiler/schemaParticleWildcardProperties.d.ts.map +0 -1
- package/dist/compiler/schemaPattern.d.ts.map +0 -1
- package/dist/compiler/schemaRegularLanguage.d.ts.map +0 -1
- package/dist/compiler/schemaScalarContext.d.ts.map +0 -1
- package/dist/compiler/schemaScalarKernel.d.ts.map +0 -1
- package/dist/compiler/schemaScalarWitnesses.d.ts.map +0 -1
- package/dist/compiler/schemaSimpleTypeProperties.d.ts.map +0 -1
- package/dist/compiler/schemaSourceGrammar.d.ts.map +0 -1
- package/dist/compiler/schemaSourceLexical.d.ts.map +0 -1
- package/dist/compiler/schemaSourceValues.d.ts.map +0 -1
- package/dist/compiler/schemaSourceWildcards.d.ts.map +0 -1
- package/dist/compiler/schemaSymbolicSequences.d.ts.map +0 -1
- package/dist/compiler/schemaSymbolicValueSets.d.ts.map +0 -1
- package/dist/compiler/schemaSyntaxAssessment.d.ts.map +0 -1
- package/dist/compiler/schemaTemporalAliases.d.ts.map +0 -1
- package/dist/compiler/schemaTokenImages.d.ts.map +0 -1
- package/dist/compiler/schemaTypeIdentity.d.ts.map +0 -1
- package/dist/compiler/schemaTypeRelations.d.ts.map +0 -1
- package/dist/compiler/schemaUri.d.ts.map +0 -1
- package/dist/compiler/schemaValueContext.d.ts.map +0 -1
- package/dist/compiler/schemaValueImages.d.ts.map +0 -1
- package/dist/compiler/schemaValueSequences.d.ts.map +0 -1
- package/dist/compiler/semanticBudget.d.ts.map +0 -1
- package/dist/compiler/semanticCatalog.d.ts.map +0 -1
- package/dist/compiler/semanticContext.d.ts.map +0 -1
- package/dist/compiler/semanticTypeDependencies.d.ts.map +0 -1
- package/dist/compiler/semanticTypeReference.d.ts.map +0 -1
- package/dist/compiler/shapeResolver.d.ts.map +0 -1
- package/dist/compiler/sourceSchemaBinding.d.ts.map +0 -1
- package/dist/compiler/structuralCompanions.d.ts.map +0 -1
- package/dist/compiler/validateSemanticGraph.d.ts.map +0 -1
- package/dist/compiler/wildcardAlgebra.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/gateway/generateGateway.d.ts.map +0 -1
- package/dist/gateway/generators.d.ts.map +0 -1
- package/dist/gateway/helpers.d.ts.map +0 -1
- package/dist/generation/preamble.d.ts.map +0 -1
- package/dist/generation/writeGeneratedSource.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/loader/fetch.d.ts.map +0 -1
- package/dist/loader/orderedSyntax.d.ts.map +0 -1
- package/dist/loader/resolutionDepth.d.ts.map +0 -1
- package/dist/loader/schemaInput.d.ts.map +0 -1
- package/dist/loader/schemaResources.d.ts.map +0 -1
- package/dist/loader/wsdlLoader.d.ts.map +0 -1
- package/dist/openapi/casing.d.ts.map +0 -1
- package/dist/openapi/generateOpenAPI.d.ts.map +0 -1
- package/dist/openapi/generatePaths.d.ts.map +0 -1
- package/dist/openapi/generateSchemas.d.ts.map +0 -1
- package/dist/openapi/security.d.ts.map +0 -1
- package/dist/pipeline.d.ts.map +0 -1
- package/dist/runtime/jsonArray.d.ts +0 -24
- package/dist/runtime/jsonArray.d.ts.map +0 -1
- package/dist/runtime/jsonArray.js +0 -52
- package/dist/runtime/ndjson.d.ts +0 -24
- package/dist/runtime/ndjson.d.ts.map +0 -1
- package/dist/runtime/ndjson.js +0 -30
- package/dist/runtime/streamXml.d.ts +0 -45
- package/dist/runtime/streamXml.d.ts.map +0 -1
- package/dist/runtime/streamXml.js +0 -212
- package/dist/test/generateTests.d.ts.map +0 -1
- package/dist/test/generators.d.ts.map +0 -1
- package/dist/test/mockData.d.ts.map +0 -1
- package/dist/util/attributeWildcards.d.ts.map +0 -1
- package/dist/util/builder.d.ts.map +0 -1
- package/dist/util/catalogMeta.d.ts.map +0 -1
- package/dist/util/cli.d.ts.map +0 -1
- package/dist/util/errors.d.ts.map +0 -1
- package/dist/util/imports.d.ts.map +0 -1
- package/dist/util/runtimeSource.d.ts.map +0 -1
- package/dist/util/securityConfig.d.ts.map +0 -1
- package/dist/util/streamConfig.d.ts.map +0 -1
- package/dist/util/tools.d.ts.map +0 -1
- package/dist/util/xmlWhitespace.d.ts.map +0 -1
- package/dist/xsd/primitives.d.ts.map +0 -1
- package/docs/AGENTS.md +0 -47
- package/docs/README.md +0 -69
- package/docs/architecture.md +0 -158
- package/docs/content-model-analysis.md +0 -92
- package/docs/content-model-baseline.md +0 -121
- package/docs/content-model-catalog.md +0 -116
- package/docs/content-model-companions.md +0 -90
- package/docs/content-model-composition.md +0 -103
- package/docs/content-model-decisions.md +0 -79
- package/docs/content-model-gateway-feasibility.md +0 -169
- package/docs/content-model-graph.md +0 -121
- package/docs/content-model-loading.md +0 -163
- package/docs/content-model-matching.md +0 -85
- package/docs/content-model-readiness.md +0 -144
- package/docs/content-model-resolution.md +0 -81
- package/docs/content-model-s02-handoff.md +0 -98
- package/docs/content-model-s06-au-01.md +0 -425
- package/docs/content-model-s06-dt-01.md +0 -386
- package/docs/content-model-s06-pw-01.md +0 -350
- package/docs/content-model-s06-re-01-resolver-implementation.md +0 -869
- package/docs/content-model-s06-re-01-resolver.md +0 -513
- package/docs/content-model-s06-re-01-scalar-witnesses.md +0 -1423
- package/docs/content-model-s06-re-01-support-reconstruction.md +0 -6337
- package/docs/content-model-s06-re-01.md +0 -7477
- package/docs/content-model-s06-research-handoff.md +0 -909
- package/docs/content-model-shipped-fix.md +0 -83
- package/docs/content-model-soap-feasibility.md +0 -165
- package/docs/decisions/001-test-generation.md +0 -36
- package/docs/decisions/002-streamable-responses.md +0 -332
- package/docs/decisions/003-content-model-contracts.md +0 -280
- package/docs/file-naming-and-path-organization.md +0 -213
- package/docs/reference-validation.md +0 -243
- package/docs/releases/README.md +0 -94
- package/docs/releases/v0.20.0.md +0 -22
- package/docs/releases/v0.21.0.md +0 -30
- package/docs/releases/v0.22.0.md +0 -30
- package/docs/releases/v0.23.0.md +0 -31
- package/docs/releases/v0.24.0.md +0 -38
- package/docs/releases/v0.25.0.md +0 -31
- package/docs/releases/v0.25.2.md +0 -32
- package/docs/releases/v0.26.0.md +0 -32
- package/docs/releases/v0.27.0.md +0 -31
- package/docs/releases/v0.28.0.md +0 -32
- package/docs/releases/v0.29.0.md +0 -32
- package/docs/releases/v0.30.0.md +0 -30
- package/docs/releases/v0.30.1.md +0 -31
- package/docs/releases/v0.30.2.md +0 -30
- package/docs/releases/v0.30.3.md +0 -33
- package/docs/releases/v0.31.0.md +0 -33
- package/docs/releases/v0.32.0.md +0 -33
- package/docs/releases/v0.33.0.md +0 -34
- package/docs/releases/v0.34.0.md +0 -30
- package/docs/releases/v0.35.0.md +0 -33
- package/docs/releases/v0.36.0.md +0 -32
- package/docs/releases/v0.37.0.md +0 -33
- package/docs/releases/v0.38.0.md +0 -35
- package/docs/releases/v0.39.0.md +0 -35
- package/docs/releases/v0.40.0.md +0 -45
- package/docs/releases/v0.40.1.md +0 -34
- package/docs/releases/v1.0.0.md +0 -42
- package/docs/releases/v1.0.1.md +0 -38
- package/docs/releases/v1.0.2.md +0 -51
- package/docs/releases/v1.0.3.md +0 -37
- package/docs/releases/v1.0.4.md +0 -45
- package/docs/releases/v1.0.5.md +0 -41
- package/docs/releases/v1.0.6.md +0 -35
- package/docs/releases/v1.0.7.md +0 -36
- package/docs/releases/v1.1.0.md +0 -42
- package/docs/releases/v1.1.1.md +0 -44
- package/docs/releases/v1.1.2.md +0 -42
- package/docs/releases/v1.1.3.md +0 -36
- package/docs/releases/v1.1.4.md +0 -36
- package/docs/releases/v1.1.5.md +0 -38
- package/docs/roadmap/README.md +0 -107
- package/docs/roadmap/v1.0-capability-conformance-framework.md +0 -582
- package/docs/roadmap/v1.0-choice-union-mode.md +0 -90
- package/docs/roadmap/v1.0-contract-audit.md +0 -75
- package/docs/roadmap/v1.0-json-array-streaming.md +0 -101
- package/docs/roadmap/v1.0-openapi-fastify-compatibility.md +0 -99
- package/docs/roadmap/v1.0-release-candidate-gates.md +0 -92
- package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +0 -200
- package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +0 -932
- package/src/runtime/jsonArray.ts +0 -55
- 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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
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
|
|
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
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
'<
|
|
90
|
-
'
|
|
91
|
-
'</
|
|
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, "&")
|
|
159
|
-
.replace(/</g, "<")
|
|
160
|
-
.replace(/>/g, ">")
|
|
161
|
-
.replace(/"/g, """)
|
|
162
|
-
.replace(/'/g, "'");
|
|
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
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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 =
|
|
8
|
+
export type StreamOperationResponse<RecordType, HeadersType = {[key: string]: unknown}> = {
|
|
9
9
|
records: AsyncIterable<RecordType>;
|
|
10
10
|
headers: HeadersType;
|
|
11
11
|
requestRaw?: string;
|