@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
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { isApplicationUnmetered } from './semanticBudget.js';
|
|
2
2
|
import { directDataOwnership, directLimit } from './directExecutionPolicy.js';
|
|
3
|
-
/**
|
|
3
|
+
/** Shared retained-operation SOAP 1.1 exchange; profile-specific authority stays explicit. */
|
|
4
4
|
import { checkSemanticBudget } from './semanticBudget.js';
|
|
5
5
|
import { DataOwnershipLimitError } from './dataOwnership.js';
|
|
6
6
|
import { Agent } from 'node:http';
|
|
7
|
+
import { Agent as HttpsAgent } from 'node:https';
|
|
7
8
|
import { types } from 'node:util';
|
|
8
9
|
import { WSDL } from 'soap/lib/wsdl/index.js';
|
|
9
10
|
import { Client } from 'soap/lib/client.js';
|
|
10
11
|
import { HttpClient } from 'soap/lib/http.js';
|
|
11
12
|
import { inspectDirectOperation } from './directOperation.js';
|
|
12
|
-
import { createDirectValueMapping, inspectDirectValueMapping } from './directValues.js';
|
|
13
|
-
import { decodeDirectXml, encodeDirectXml, DIRECT_XML_LIMITS } from './directCodec.js';
|
|
14
|
-
import { prepareDirectSoapSource, DirectSoapSourceError } from './directSoapSource.js';
|
|
15
|
-
import { isXmlNCName, resolveLexicalQName, SchemaLoadingError } from '../loader/orderedSyntax.js';
|
|
13
|
+
import { createDirectValueMapping, inspectDirectValueMapping, createComponentDirectionalMapping, inspectComponentValueMapping } from './directValues.js';
|
|
14
|
+
import { decodeDirectXml, encodeDirectXml, decodeComponentXml, encodeComponentXml, DIRECT_XML_LIMITS } from './directCodec.js';
|
|
15
|
+
import { prepareDirectSoapSource, prepareComponentSoapWsdl, DirectSoapSourceError } from './directSoapSource.js';
|
|
16
|
+
import { isXmlNCName, resolveLexicalQName, SchemaLoadingError, syntaxElements, syntaxAttribute, WSDL_NAMESPACE } from '../loader/orderedSyntax.js';
|
|
17
|
+
import { decodeComponentRecordXml, inspectComponentRecordProjection } from './componentRecordProjection.js';
|
|
18
|
+
import { assessComponentSoapHeader } from './soapHeaders.js';
|
|
16
19
|
const SOAP = 'http://schemas.xmlsoap.org/soap/envelope/';
|
|
17
20
|
class Stop extends Error {
|
|
18
21
|
kind;
|
|
@@ -25,11 +28,11 @@ class Stop extends Error {
|
|
|
25
28
|
}
|
|
26
29
|
const same = (a, b) => a.namespace === b.namespace && a.local === b.local;
|
|
27
30
|
/** Shared entry guard: consumers must call before reading any SOAP option. */
|
|
28
|
-
export function directSoapOptionsShape(options, check) {
|
|
31
|
+
export function directSoapOptionsShape(options, check, additional = []) {
|
|
29
32
|
if (!options || typeof options !== 'object' || types.isProxy(options)
|
|
30
33
|
|| ![null, Object.prototype].includes(Object.getPrototypeOf(options)))
|
|
31
34
|
return 'data-only SOAP options required';
|
|
32
|
-
const allowed = new Set(['service', 'port', 'endpoint', 'allowEndpoint', 'signal', 'timeoutMs', 'limits', 'capabilities']);
|
|
35
|
+
const allowed = new Set(['service', 'port', 'endpoint', 'allowEndpoint', 'signal', 'timeoutMs', 'limits', 'capabilities', ...additional]);
|
|
33
36
|
for (const key of Reflect.ownKeys(options)) {
|
|
34
37
|
check();
|
|
35
38
|
const descriptor = Object.getOwnPropertyDescriptor(options, key);
|
|
@@ -40,12 +43,58 @@ export function directSoapOptionsShape(options, check) {
|
|
|
40
43
|
}
|
|
41
44
|
/** Authentication and fresh-value validation precede dependency bootstrap and all HTTP I/O. */
|
|
42
45
|
export async function exchangeDirectSoap(contract, inputMapping, application, options) {
|
|
43
|
-
const { context, source } = inspectDirectOperation(contract);
|
|
44
46
|
const input = inspectDirectValueMapping(inputMapping, contract);
|
|
47
|
+
return exchangeSoap(contract, input, application, options, {
|
|
48
|
+
component: false, encode: encodeDirectXml, decode: decodeDirectXml, create: createDirectValueMapping,
|
|
49
|
+
prepare: async (selection, check) => {
|
|
50
|
+
const { source } = inspectDirectOperation(contract);
|
|
51
|
+
const { wsdlText } = prepareDirectSoapSource(contract, selection, check);
|
|
52
|
+
const wsdl = new WSDL(wsdlText, source.root.uri, { wsdl_options: { overrideImportLocation: () => { throw new Stop('unsupported', 'dependency import forbidden'); } } });
|
|
53
|
+
await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
|
|
54
|
+
return wsdl;
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export async function exchangeComponentSoap(contract, inputMapping, application, options, responseProjection) {
|
|
59
|
+
const { mapping: input } = inspectComponentValueMapping(inputMapping, contract);
|
|
60
|
+
if (responseProjection !== undefined) {
|
|
61
|
+
inspectComponentRecordProjection(responseProjection, contract);
|
|
62
|
+
return exchangeSoap(contract, input, application, options, {
|
|
63
|
+
component: true,
|
|
64
|
+
encode(owner, mapping, value, controls) {
|
|
65
|
+
if (mapping.kind !== 'component-mapping')
|
|
66
|
+
throw new TypeError('SOAP input requires the native input mapping');
|
|
67
|
+
return encodeComponentXml(owner, mapping, value, controls);
|
|
68
|
+
},
|
|
69
|
+
decode(owner, mapping, bytes, controls) {
|
|
70
|
+
if (mapping.kind === 'component-record-projection')
|
|
71
|
+
return decodeComponentRecordXml(owner, mapping, bytes, controls);
|
|
72
|
+
return decodeComponentXml(owner, mapping, bytes, { ...controls, selectPayload(root) {
|
|
73
|
+
const selected = controls.selectPayload(root);
|
|
74
|
+
if (selected.mapping.kind !== 'component-mapping')
|
|
75
|
+
throw new TypeError('Normal component decoding requires its exact mapping');
|
|
76
|
+
return { payload: selected.payload, mapping: selected.mapping };
|
|
77
|
+
} });
|
|
78
|
+
},
|
|
79
|
+
create(owner, direction, controls) {
|
|
80
|
+
return direction.kind === 'output' ? responseProjection : createComponentDirectionalMapping(owner, input, direction, controls);
|
|
81
|
+
},
|
|
82
|
+
prepare: (selection, check) => prepareComponentSoapWsdl(contract, selection, check),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return exchangeSoap(contract, input, application, options, {
|
|
86
|
+
component: true, encode: encodeComponentXml, decode: decodeComponentXml,
|
|
87
|
+
create: (owner, direction, controls) => createComponentDirectionalMapping(owner, input, direction, controls),
|
|
88
|
+
prepare: (selection, check) => prepareComponentSoapWsdl(contract, selection, check),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function exchangeSoap(contract, input, application, options, profile) {
|
|
92
|
+
const { context } = inspectDirectOperation(contract);
|
|
45
93
|
if (input.direction.kind !== 'input')
|
|
46
94
|
throw new TypeError('SOAP request requires the exact input mapping');
|
|
47
95
|
const { budget } = context;
|
|
48
|
-
const fail = (kind, rule) => Object.freeze({ kind, rule,
|
|
96
|
+
const fail = (kind, rule, phase) => Object.freeze({ kind, rule,
|
|
97
|
+
...(profile.component && phase ? { phase } : {}), usage: Object.freeze({ ...budget.usage() }) });
|
|
49
98
|
let signal;
|
|
50
99
|
const check = () => { checkSemanticBudget(budget); if (signal?.aborted)
|
|
51
100
|
throw new Stop('cancelled', 'cooperative-cancellation'); };
|
|
@@ -58,7 +107,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
58
107
|
check();
|
|
59
108
|
// Options are a closed capability surface. Never silently discard security,
|
|
60
109
|
// headers, endpoint agents, redirects, streaming or other caller extensions.
|
|
61
|
-
const optionRule = directSoapOptionsShape(options, check);
|
|
110
|
+
const optionRule = directSoapOptionsShape(options, check, profile.component ? ['ca'] : []);
|
|
62
111
|
if (optionRule)
|
|
63
112
|
return fail('unsupported', optionRule);
|
|
64
113
|
signal = options.signal;
|
|
@@ -66,8 +115,20 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
66
115
|
return fail('unsupported', 'native AbortSignal required');
|
|
67
116
|
const allowEndpoint = options.allowEndpoint;
|
|
68
117
|
check();
|
|
69
|
-
|
|
70
|
-
|
|
118
|
+
let selectedEndpoint = options.endpoint;
|
|
119
|
+
if (profile.component && selectedEndpoint === undefined) {
|
|
120
|
+
const { source } = inspectDirectOperation(contract);
|
|
121
|
+
const services = source.documents.flatMap(d => syntaxElements(d.root, WSDL_NAMESPACE, 'service').filter(n => syntaxAttribute(d.root, 'targetNamespace') === options.service?.namespace && syntaxAttribute(n, 'name') === options.service?.local));
|
|
122
|
+
const ports = services.flatMap(n => syntaxElements(n, WSDL_NAMESPACE, 'port').filter(p => syntaxAttribute(p, 'name') === options.port));
|
|
123
|
+
const addresses = ports.flatMap(p => syntaxElements(p, 'http://schemas.xmlsoap.org/wsdl/soap/', 'address'));
|
|
124
|
+
if (services.length !== 1 || ports.length !== 1 || addresses.length !== 1 || !syntaxAttribute(addresses[0], 'location')) {
|
|
125
|
+
return fail('unsupported', 'Select one SOAP service/port address or supply an endpoint override');
|
|
126
|
+
}
|
|
127
|
+
selectedEndpoint = syntaxAttribute(addresses[0], 'location');
|
|
128
|
+
}
|
|
129
|
+
const config = directDataOwnership(budget).freeze(directDataOwnership(budget).snapshot({ service: options.service, port: options.port, endpoint: selectedEndpoint,
|
|
130
|
+
timeoutMs: options.timeoutMs ?? (profile.component || isApplicationUnmetered(budget) ? 0 : 15_000), limits: options.limits ?? {},
|
|
131
|
+
ca: options.ca, capabilities: options.capabilities ?? [] }));
|
|
71
132
|
if (!Array.isArray(config.capabilities) || config.capabilities.length)
|
|
72
133
|
return fail('unsupported', 'SOAP capability');
|
|
73
134
|
if (!Number.isSafeInteger(config.timeoutMs) || config.timeoutMs < 0 || config.timeoutMs > 2_147_483_647)
|
|
@@ -81,62 +142,107 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
81
142
|
if (typeof config.endpoint !== 'string' || typeof config.port !== 'string' || !isXmlNCName(config.port)
|
|
82
143
|
|| !config.service || typeof config.service.namespace !== 'string' || !isXmlNCName(config.service.local))
|
|
83
144
|
return fail('unsupported', 'explicit SOAP selection');
|
|
84
|
-
|
|
85
|
-
|
|
145
|
+
let endpoint;
|
|
146
|
+
try {
|
|
147
|
+
endpoint = new URL(config.endpoint);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return fail('unsupported', 'explicit HTTP(S) endpoint required');
|
|
151
|
+
}
|
|
152
|
+
if (profile.component) {
|
|
153
|
+
if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password || endpoint.hash || endpoint.search)
|
|
154
|
+
return fail('unsupported', 'explicit HTTP(S) endpoint required');
|
|
155
|
+
if (config.ca !== undefined && (typeof config.ca !== 'string' || endpoint.protocol !== 'https:'))
|
|
156
|
+
return fail('unsupported', 'HTTPS PEM trust anchor required');
|
|
157
|
+
const policy = contract.policy;
|
|
158
|
+
if (!policy)
|
|
159
|
+
return fail('unsupported', 'component policy authority required');
|
|
160
|
+
if (policy.kind === 'https-transport') {
|
|
161
|
+
if (endpoint.protocol !== 'https:')
|
|
162
|
+
return fail('unsupported', 'policy requires HTTPS');
|
|
163
|
+
if (policy.requireClientCertificate || policy.includeTimestamp || !['Strict', 'Lax'].includes(policy.layout))
|
|
164
|
+
return fail('unsupported', 'message security or client certificate capability required');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else if (endpoint.protocol !== 'http:' || endpoint.hostname !== '127.0.0.1' || !endpoint.port || endpoint.port === '1'
|
|
86
168
|
|| endpoint.username || endpoint.password || endpoint.hash || endpoint.search)
|
|
87
169
|
return fail('unsupported', 'owned loopback HTTP endpoint required');
|
|
88
|
-
if (
|
|
170
|
+
if (!(profile.component && allowEndpoint === undefined)
|
|
171
|
+
&& (typeof allowEndpoint !== 'function' || allowEndpoint(new URL(endpoint.href)) !== true))
|
|
89
172
|
return fail('unsupported', 'endpoint authorization');
|
|
90
173
|
const action = contract.binding.action;
|
|
174
|
+
const rpc = contract.binding.style === 'rpc';
|
|
91
175
|
if (/[^\x20-\x21\x23-\x7e]|\\/.test(action))
|
|
92
176
|
return fail('unsupported', 'unsafe SOAPAction');
|
|
93
|
-
const { wsdlText } = prepareDirectSoapSource(contract, config, check);
|
|
94
177
|
const elements = (node) => {
|
|
95
178
|
check();
|
|
96
179
|
return node.children.filter((child) => child.kind === 'element');
|
|
97
180
|
};
|
|
98
|
-
const encoded =
|
|
99
|
-
if (
|
|
100
|
-
return fail(encoded.kind, encoded.rule);
|
|
101
|
-
const output =
|
|
102
|
-
if (
|
|
181
|
+
const encoded = profile.encode(contract, input, application, { signal, limits });
|
|
182
|
+
if (!('bytes' in encoded))
|
|
183
|
+
return fail(encoded.kind, encoded.rule, 'input');
|
|
184
|
+
const output = profile.create(contract, { kind: 'output' }, { signal });
|
|
185
|
+
if (!('direction' in output))
|
|
103
186
|
return fail(output.kind, output.rule);
|
|
104
187
|
const faults = new Map();
|
|
105
188
|
for (const fault of contract.faults) {
|
|
106
189
|
check();
|
|
107
|
-
const mapping =
|
|
108
|
-
if (
|
|
190
|
+
const mapping = profile.create(contract, { kind: 'fault', name: fault.name }, { signal });
|
|
191
|
+
if (!('direction' in mapping))
|
|
109
192
|
return fail(mapping.kind, mapping.rule);
|
|
110
193
|
faults.set(fault.name, mapping);
|
|
111
194
|
}
|
|
112
|
-
const shape = (node) => {
|
|
195
|
+
const shape = (node, encodedScope = false) => {
|
|
113
196
|
const children = elements(node);
|
|
114
|
-
if (node.attributes.
|
|
197
|
+
if (node.attributes.some(a => !(encodedScope && a.name.namespace === SOAP && a.name.local === 'encodingStyle'
|
|
198
|
+
&& a.value === 'http://schemas.xmlsoap.org/soap/encoding/')) || node.children.some(n => n.kind === 'text' && /[^\t\r\n ]/.test(n.value)))
|
|
115
199
|
stop('protocol', 'SOAP protocol attributes or text');
|
|
116
200
|
return children;
|
|
117
201
|
};
|
|
118
|
-
const
|
|
202
|
+
const ignoredHeaders = [];
|
|
203
|
+
const bodyRoot = (root, incoming = false) => {
|
|
119
204
|
if (!same(root.name, { namespace: SOAP, local: 'Envelope' }))
|
|
120
205
|
stop('protocol', 'SOAP 1.1 Envelope required');
|
|
121
|
-
const children = shape(root);
|
|
206
|
+
const children = shape(root, rpc);
|
|
122
207
|
if (children[0]?.name.namespace === SOAP && children[0].name.local === 'Header') {
|
|
123
|
-
if (
|
|
208
|
+
if (profile.component && incoming) {
|
|
209
|
+
const assessed = assessComponentSoapHeader(children[0], check);
|
|
210
|
+
if (assessed.kind !== 'ignored-optional-headers')
|
|
211
|
+
stop(assessed.kind, assessed.rule);
|
|
212
|
+
else
|
|
213
|
+
for (const name of assessed.headers) {
|
|
214
|
+
check();
|
|
215
|
+
ignoredHeaders.push(name);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else if (shape(children[0]).length)
|
|
124
219
|
stop('unsupported', 'incoming SOAP headers');
|
|
125
220
|
children.shift();
|
|
126
221
|
}
|
|
127
222
|
if (children.length !== 1 || !same(children[0].name, { namespace: SOAP, local: 'Body' }))
|
|
128
223
|
stop('protocol', 'one SOAP Body required');
|
|
129
|
-
const body = shape(children[0]);
|
|
224
|
+
const body = shape(children[0], rpc);
|
|
225
|
+
if (rpc && !body.some(n => same(n.name, { namespace: SOAP, local: 'Fault' })))
|
|
226
|
+
return children[0];
|
|
130
227
|
if (body.length !== 1)
|
|
131
228
|
stop('protocol', 'one SOAP Body payload required');
|
|
132
229
|
return body[0];
|
|
133
230
|
};
|
|
134
|
-
|
|
135
|
-
const wsdl = new WSDL(wsdlText, source.root.uri, { wsdl_options: { overrideImportLocation: () => { throw new Stop('unsupported', 'dependency import forbidden'); } } });
|
|
136
|
-
await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
|
|
231
|
+
const wsdl = await profile.prepare(config, check);
|
|
137
232
|
check();
|
|
233
|
+
// @why node-soap's RPC writer would wrap `_xml` as a parameter. This private
|
|
234
|
+
// instance retains its selected method/transport while native bytes own RPC construction.
|
|
235
|
+
const rpcArguments = Object.freeze({});
|
|
236
|
+
if (rpc)
|
|
237
|
+
wsdl.objectToRpcXML = (name, args) => {
|
|
238
|
+
check();
|
|
239
|
+
if (name !== contract.selector.operation || args !== rpcArguments)
|
|
240
|
+
stop('protocol', 'dependency RPC selection mismatch');
|
|
241
|
+
return Buffer.from(encoded.bytes).toString('utf8');
|
|
242
|
+
};
|
|
138
243
|
// HTTP and codec byte limits bound buffering and output copies directly.
|
|
139
|
-
agent = new
|
|
244
|
+
agent = endpoint.protocol === 'https:' ? new HttpsAgent({ keepAlive: false, maxSockets: 1, rejectUnauthorized: true,
|
|
245
|
+
...(config.ca === undefined ? {} : { ca: config.ca }) }) : new Agent({ keepAlive: false, maxSockets: 1 });
|
|
140
246
|
controller = new AbortController();
|
|
141
247
|
signal?.addEventListener('abort', abort, { once: true });
|
|
142
248
|
let timedOut = false;
|
|
@@ -153,9 +259,9 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
153
259
|
stop('protocol', 'dependency dispatch mismatch');
|
|
154
260
|
if (Buffer.byteLength(data) > limits.maxBytes)
|
|
155
261
|
stop('resource-limit', 'SOAP request byte limit');
|
|
156
|
-
const outgoing =
|
|
262
|
+
const outgoing = profile.decode(contract, input, Buffer.from(data), { signal, limits,
|
|
157
263
|
uri: 'urn:typescript-wsdl-client:outgoing-soap', selectPayload: root => ({ payload: bodyRoot(root), mapping: input }) });
|
|
158
|
-
if (
|
|
264
|
+
if (!('validated' in outgoing))
|
|
159
265
|
stop(outgoing.kind, outgoing.rule);
|
|
160
266
|
check();
|
|
161
267
|
}
|
|
@@ -185,7 +291,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
185
291
|
// xmlToObject, including its special err.response parsing path.
|
|
186
292
|
callback(complete);
|
|
187
293
|
}, headers, { responseType: 'arraybuffer', decompress: false, maxRedirects: 0, maxContentLength: limits.maxBytes,
|
|
188
|
-
maxBodyLength: limits.maxBytes, proxy: false, httpAgent: agent, signal: controller.signal, timeout: config.timeoutMs });
|
|
294
|
+
maxBodyLength: limits.maxBytes, proxy: false, httpAgent: agent, httpsAgent: agent, signal: controller.signal, timeout: config.timeoutMs });
|
|
189
295
|
}
|
|
190
296
|
}
|
|
191
297
|
const client = new Client(wsdl, endpoint.href, { httpClient: new BufferedHttp() });
|
|
@@ -198,7 +304,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
198
304
|
if (typeof method !== 'function')
|
|
199
305
|
return fail('unsupported', 'dependency selected method unavailable');
|
|
200
306
|
check();
|
|
201
|
-
await new Promise((resolve, reject) => method({ _xml: Buffer.from(encoded.bytes).toString('utf8') }, (error) => error === complete ? resolve() : reject(error), {}, { SOAPAction: `"${action}"` }));
|
|
307
|
+
await new Promise((resolve, reject) => method(rpc ? rpcArguments : { _xml: Buffer.from(encoded.bytes).toString('utf8') }, (error) => error === complete ? resolve() : reject(error), {}, { SOAPAction: `"${action}"` }));
|
|
202
308
|
check();
|
|
203
309
|
if (timedOut)
|
|
204
310
|
return fail('transport', 'SOAP deadline exceeded');
|
|
@@ -209,21 +315,24 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
209
315
|
const observed = response;
|
|
210
316
|
if (observed.encoding && observed.encoding.toLowerCase() !== 'identity')
|
|
211
317
|
return fail('unsupported', 'HTTP compression');
|
|
212
|
-
const media = /^text\/xml(?:\s*;\s*charset\s*=\s*(?:"(utf-8|utf-16|utf-16le|utf-16be)"|(utf-8|utf-16|utf-16le|utf-16be)))?\s*$/i.exec(observed.contentType);
|
|
318
|
+
const media = /^text\/xml(?:\s*;\s*charset\s*=\s*(?:"(utf-8|utf-16|utf-16le|utf-16be|iso-8859-1)"|(utf-8|utf-16|utf-16le|utf-16be|iso-8859-1)))?\s*$/i.exec(observed.contentType);
|
|
213
319
|
if (!media)
|
|
214
320
|
return fail('protocol', 'SOAP response Content-Type');
|
|
215
321
|
if (observed.status !== 200 && observed.status !== 500)
|
|
216
322
|
return fail('transport', 'SOAP HTTP status');
|
|
217
323
|
// Header charset is a protocol assertion, checked against actual BOM bytes.
|
|
218
324
|
const charset = (media[1] ?? media[2])?.toLowerCase();
|
|
325
|
+
if (!profile.component && charset === 'iso-8859-1')
|
|
326
|
+
return fail('protocol', 'SOAP response Content-Type');
|
|
219
327
|
const bom = observed.bytes[0] === 0xff && observed.bytes[1] === 0xfe ? 'utf-16le'
|
|
220
328
|
: observed.bytes[0] === 0xfe && observed.bytes[1] === 0xff ? 'utf-16be' : 'utf-8';
|
|
221
|
-
if (charset && charset !== bom && !(charset === 'utf-16' && bom.startsWith('utf-16')))
|
|
329
|
+
if (!profile.component && charset && charset !== bom && !(charset === 'utf-16' && bom.startsWith('utf-16')))
|
|
222
330
|
return fail('protocol', 'SOAP charset disagrees with bytes');
|
|
223
331
|
let faultInfo;
|
|
224
|
-
const decoded =
|
|
332
|
+
const decoded = profile.decode(contract, output, observed.bytes, { signal, limits, uri: endpoint.href,
|
|
333
|
+
...(profile.component ? { componentResponseEncoding: { charset } } : {}),
|
|
225
334
|
selectPayload: root => {
|
|
226
|
-
const payload = bodyRoot(root);
|
|
335
|
+
const payload = bodyRoot(root, true);
|
|
227
336
|
if (!same(payload.name, { namespace: SOAP, local: 'Fault' })) {
|
|
228
337
|
if (observed.status !== 200)
|
|
229
338
|
stop('protocol', 'HTTP 500 requires SOAP Fault');
|
|
@@ -261,12 +370,13 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
|
|
|
261
370
|
directDataOwnership(budget).freeze(faultInfo);
|
|
262
371
|
return { payload: detail[0], mapping: faults.get(faultInfo.name) };
|
|
263
372
|
} });
|
|
264
|
-
if (
|
|
265
|
-
return fail(decoded.kind, decoded.rule);
|
|
373
|
+
if (!('validated' in decoded))
|
|
374
|
+
return fail(decoded.kind, decoded.rule, 'response');
|
|
266
375
|
check();
|
|
267
376
|
check();
|
|
268
377
|
return Object.freeze({ kind: faultInfo ? 'soap-fault' : 'soap-response', admitted: false, decoded,
|
|
269
|
-
responseBytes: new Uint8Array(observed.bytes), status: observed.status, ...(faultInfo ? { fault: faultInfo } : {}),
|
|
378
|
+
responseBytes: new Uint8Array(observed.bytes), status: observed.status, ...(faultInfo ? { fault: faultInfo } : {}),
|
|
379
|
+
...(ignoredHeaders.length ? { ignoredHeaders: Object.freeze(ignoredHeaders) } : {}), usage: Object.freeze({ ...budget.usage() }) });
|
|
270
380
|
}
|
|
271
381
|
catch (error) {
|
|
272
382
|
if (budget.exhausted())
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DirectOperationContract } from './directOperation.js';
|
|
2
2
|
import type { ExpandedName } from '../loader/orderedSyntax.js';
|
|
3
|
+
import { WSDL } from 'soap/lib/wsdl/index.js';
|
|
3
4
|
export declare const DIRECT_SOAP_SOURCE_MAX_BYTES: number;
|
|
4
5
|
export declare class DirectSoapSourceError extends Error {
|
|
5
6
|
readonly kind: 'unsupported' | 'resource-limit';
|
|
@@ -12,4 +13,26 @@ export declare function prepareDirectSoapSource(contract: DirectOperationContrac
|
|
|
12
13
|
original: Uint8Array<ArrayBufferLike>;
|
|
13
14
|
wsdlText: string;
|
|
14
15
|
};
|
|
15
|
-
|
|
16
|
+
/** Check each native operation before sharing its source metadata.
|
|
17
|
+
* @param contract Authentic component operation.
|
|
18
|
+
* @param config Exact service and port.
|
|
19
|
+
* @param check Invocation cancellation/resource checks.
|
|
20
|
+
* @returns No metadata or portable authority.
|
|
21
|
+
* @throws For foreign handles, unsupported source profile, action or selection.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateComponentSoapSelection(contract: DirectOperationContract, config: {
|
|
24
|
+
service: ExpandedName;
|
|
25
|
+
port: string;
|
|
26
|
+
}, check: () => void): void;
|
|
27
|
+
/** Build the existing SOAP dependency from the exact authorized snapshot, with no file/network import fallback.
|
|
28
|
+
* @remarks Acyclic metadata resources are decoded independently under the native metadata policy. Original bytes and native semantics
|
|
29
|
+
* are unchanged. The dependency receives private aliases and a fresh prefilled cache; its import hook accepts only
|
|
30
|
+
* unambiguous native source edges to already prepared resources. This grants no endpoint or policy enforcement.
|
|
31
|
+
* @returns A prepared node-soap WSDL for the exact original service/port/binding.
|
|
32
|
+
* @throws DirectSoapSourceError For incompatible source/profile, unsafe dependency names, cycles or ambiguous imports.
|
|
33
|
+
* Caller cancellation/resource exceptions propagate unchanged.
|
|
34
|
+
*/
|
|
35
|
+
export declare function prepareComponentSoapWsdl(contract: DirectOperationContract, config: {
|
|
36
|
+
service: ExpandedName;
|
|
37
|
+
port: string;
|
|
38
|
+
}, check: () => void): Promise<WSDL>;
|
|
@@ -2,7 +2,9 @@ import { directLimit } from './directExecutionPolicy.js';
|
|
|
2
2
|
/** Shared authenticated single-resource SOAP bootstrap policy; no transport. */
|
|
3
3
|
import { inspectDirectOperation } from './directOperation.js';
|
|
4
4
|
import { copyOriginalSchemaResource } from '../loader/schemaInput.js';
|
|
5
|
-
import { resolveLexicalQName, syntaxAttribute, WSDL_NAMESPACE, XSD_NAMESPACE } from '../loader/orderedSyntax.js';
|
|
5
|
+
import { decodeMetadataXml, resolveLexicalQName, syntaxAttribute, WSDL_NAMESPACE, XSD_NAMESPACE } from '../loader/orderedSyntax.js';
|
|
6
|
+
import { WSDL } from 'soap/lib/wsdl/index.js';
|
|
7
|
+
import { normalizeWhitespace } from './datatypeValues.js';
|
|
6
8
|
const WSDL_SOAP = 'http://schemas.xmlsoap.org/wsdl/soap/';
|
|
7
9
|
const same = (a, b) => a.namespace === b.namespace && a.local === b.local;
|
|
8
10
|
export const DIRECT_SOAP_SOURCE_MAX_BYTES = 64 * 1024;
|
|
@@ -13,6 +15,26 @@ export class DirectSoapSourceError extends Error {
|
|
|
13
15
|
this.kind = kind;
|
|
14
16
|
}
|
|
15
17
|
}
|
|
18
|
+
function validateSoapSelection(source, contract, config, check) {
|
|
19
|
+
const elements = (node) => { check(); return node.children.filter((child) => child.kind === 'element'); };
|
|
20
|
+
const definitions = source.root.root;
|
|
21
|
+
if (definitions.name.namespace !== WSDL_NAMESPACE || definitions.name.local !== 'definitions')
|
|
22
|
+
throw new DirectSoapSourceError('WSDL definitions required');
|
|
23
|
+
const services = elements(definitions).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'service'
|
|
24
|
+
&& same({ namespace: syntaxAttribute(definitions, 'targetNamespace') ?? '', local: syntaxAttribute(n, 'name') ?? '' }, config.service));
|
|
25
|
+
if (services.length !== 1)
|
|
26
|
+
throw new DirectSoapSourceError('SOAP service mismatch');
|
|
27
|
+
const ports = elements(services[0]).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'port' && syntaxAttribute(n, 'name') === config.port);
|
|
28
|
+
if (ports.length !== 1)
|
|
29
|
+
throw new DirectSoapSourceError('SOAP port mismatch');
|
|
30
|
+
const binding = syntaxAttribute(ports[0], 'binding');
|
|
31
|
+
if (!binding || !same(resolveLexicalQName(binding, ports[0]), contract.selector.binding))
|
|
32
|
+
throw new DirectSoapSourceError('SOAP binding mismatch');
|
|
33
|
+
const addresses = elements(ports[0]).filter(n => n.name.namespace === WSDL_SOAP && n.name.local === 'address');
|
|
34
|
+
if (addresses.length !== 1 || elements(ports[0]).some(n => !(n.name.namespace === WSDL_SOAP && n.name.local === 'address')
|
|
35
|
+
&& !(n.name.namespace === WSDL_NAMESPACE && n.name.local === 'documentation')))
|
|
36
|
+
throw new DirectSoapSourceError('SOAP port extension');
|
|
37
|
+
}
|
|
16
38
|
export function prepareDirectSoapSource(contract, config, check) {
|
|
17
39
|
const { source, context: { budget } } = inspectDirectOperation(contract);
|
|
18
40
|
if (source.resources.some(r => r.byteLength > directLimit(budget, DIRECT_SOAP_SOURCE_MAX_BYTES))) {
|
|
@@ -53,24 +75,8 @@ export function prepareDirectSoapSource(contract, config, check) {
|
|
|
53
75
|
inspectSource(child);
|
|
54
76
|
};
|
|
55
77
|
inspectSource(source.root.root);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
throw new DirectSoapSourceError('WSDL definitions required');
|
|
59
|
-
const services = elements(definitions).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'service'
|
|
60
|
-
&& same({ namespace: syntaxAttribute(definitions, 'targetNamespace') ?? '', local: syntaxAttribute(n, 'name') ?? '' }, config.service));
|
|
61
|
-
if (services.length !== 1)
|
|
62
|
-
throw new DirectSoapSourceError('SOAP service mismatch');
|
|
63
|
-
const ports = elements(services[0]).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'port' && syntaxAttribute(n, 'name') === config.port);
|
|
64
|
-
if (ports.length !== 1)
|
|
65
|
-
throw new DirectSoapSourceError('SOAP port mismatch');
|
|
66
|
-
const binding = syntaxAttribute(ports[0], 'binding');
|
|
67
|
-
if (!binding || !same(resolveLexicalQName(binding, ports[0]), contract.selector.binding))
|
|
68
|
-
throw new DirectSoapSourceError('SOAP binding mismatch');
|
|
69
|
-
const addresses = elements(ports[0]).filter(n => n.name.namespace === WSDL_SOAP && n.name.local === 'address');
|
|
70
|
-
if (addresses.length !== 1 || elements(ports[0]).some(n => !(n.name.namespace === WSDL_SOAP && n.name.local === 'address')
|
|
71
|
-
&& !(n.name.namespace === WSDL_NAMESPACE && n.name.local === 'documentation')))
|
|
72
|
-
throw new DirectSoapSourceError('SOAP port extension');
|
|
73
|
-
const original = copyOriginalSchemaResource(source, source.root.uri, amount => { check(); });
|
|
78
|
+
validateSoapSelection(source, contract, config, check);
|
|
79
|
+
const original = copyOriginalSchemaResource(source, source.root.uri, () => { check(); });
|
|
74
80
|
// This packet admits UTF-8 source bootstrap only; response encoding remains
|
|
75
81
|
// owned by the existing strict XML byte decoder.
|
|
76
82
|
let wsdlText;
|
|
@@ -84,3 +90,144 @@ export function prepareDirectSoapSource(contract, config, check) {
|
|
|
84
90
|
throw new DirectSoapSourceError('UTF-8 WSDL bootstrap required');
|
|
85
91
|
return { original, wsdlText };
|
|
86
92
|
}
|
|
93
|
+
/** Check each native operation before sharing its source metadata.
|
|
94
|
+
* @param contract Authentic component operation.
|
|
95
|
+
* @param config Exact service and port.
|
|
96
|
+
* @param check Invocation cancellation/resource checks.
|
|
97
|
+
* @returns No metadata or portable authority.
|
|
98
|
+
* @throws For foreign handles, unsupported source profile, action or selection.
|
|
99
|
+
*/
|
|
100
|
+
export function validateComponentSoapSelection(contract, config, check) {
|
|
101
|
+
const { source } = inspectDirectOperation(contract);
|
|
102
|
+
check();
|
|
103
|
+
if (contract.basis !== 'native-component-premises-v1' || contract.correspondence !== 'dated-XSD-2004-components-v1')
|
|
104
|
+
throw new DirectSoapSourceError('Component source profile required');
|
|
105
|
+
if (/[^\x20-\x21\x23-\x7e]|\\/.test(contract.binding.action))
|
|
106
|
+
throw new DirectSoapSourceError('unsafe SOAPAction');
|
|
107
|
+
validateSoapSelection(source, contract, config, check);
|
|
108
|
+
}
|
|
109
|
+
/** Build the existing SOAP dependency from the exact authorized snapshot, with no file/network import fallback.
|
|
110
|
+
* @remarks Acyclic metadata resources are decoded independently under the native metadata policy. Original bytes and native semantics
|
|
111
|
+
* are unchanged. The dependency receives private aliases and a fresh prefilled cache; its import hook accepts only
|
|
112
|
+
* unambiguous native source edges to already prepared resources. This grants no endpoint or policy enforcement.
|
|
113
|
+
* @returns A prepared node-soap WSDL for the exact original service/port/binding.
|
|
114
|
+
* @throws DirectSoapSourceError For incompatible source/profile, unsafe dependency names, cycles or ambiguous imports.
|
|
115
|
+
* Caller cancellation/resource exceptions propagate unchanged.
|
|
116
|
+
*/
|
|
117
|
+
export async function prepareComponentSoapWsdl(contract, config, check) {
|
|
118
|
+
const { source, context: { budget } } = inspectDirectOperation(contract);
|
|
119
|
+
validateComponentSoapSelection(contract, config, check);
|
|
120
|
+
const refuse = (rule) => { throw new DirectSoapSourceError(rule); };
|
|
121
|
+
const nodes = new Map(), dependencySyntax = new Set();
|
|
122
|
+
const key = (uri, path) => JSON.stringify([uri, path]);
|
|
123
|
+
for (const edge of source.edges) {
|
|
124
|
+
check();
|
|
125
|
+
dependencySyntax.add(key(edge.source.uri, edge.source.path));
|
|
126
|
+
}
|
|
127
|
+
for (const document of source.documents) {
|
|
128
|
+
const pending = [document.root];
|
|
129
|
+
while (pending.length) {
|
|
130
|
+
check();
|
|
131
|
+
const node = pending.pop();
|
|
132
|
+
budget.chargeWork(32 + node.children.length * 8 + node.attributes.length * 16);
|
|
133
|
+
const identity = key(node.source.uri, node.source.path);
|
|
134
|
+
nodes.set(identity, node);
|
|
135
|
+
if (['import', 'include', 'redefine'].includes(node.name.local) && !dependencySyntax.has(identity))
|
|
136
|
+
refuse('unowned dependency syntax');
|
|
137
|
+
for (const attribute of node.attributes) {
|
|
138
|
+
check();
|
|
139
|
+
if (attribute.name.local === 'name' && (attribute.value in Object.prototype || attribute.value === 'prototype'))
|
|
140
|
+
refuse('dependency reserved name');
|
|
141
|
+
}
|
|
142
|
+
for (const prefix in node.namespaces) {
|
|
143
|
+
check();
|
|
144
|
+
if (['__proto__', 'prototype', 'constructor'].includes(prefix) || /["<&\r\n\t]/.test(node.namespaces[prefix]))
|
|
145
|
+
refuse('dependency namespace interpolation');
|
|
146
|
+
}
|
|
147
|
+
for (const child of node.children)
|
|
148
|
+
if (child.kind === 'element')
|
|
149
|
+
pending.push(child);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const resources = [...source.resources].sort((a, b) => a.uri < b.uri ? -1 : a.uri > b.uri ? 1 : 0);
|
|
153
|
+
const aliases = new Map(), originals = new Map();
|
|
154
|
+
const dependencies = new Map(), imports = new Map();
|
|
155
|
+
for (const [index, resource] of resources.entries()) {
|
|
156
|
+
check();
|
|
157
|
+
const alias = 'https://wsdl-snapshot.invalid/resource/' + index;
|
|
158
|
+
aliases.set(resource.uri, alias);
|
|
159
|
+
originals.set(alias, resource.uri);
|
|
160
|
+
dependencies.set(resource.uri, new Set());
|
|
161
|
+
}
|
|
162
|
+
const schemaUris = new Map(source.schemas.map(schema => [schema.key, schema.documentUri]));
|
|
163
|
+
for (const edge of source.edges) {
|
|
164
|
+
check();
|
|
165
|
+
if (!edge.to)
|
|
166
|
+
continue;
|
|
167
|
+
const target = schemaUris.get(edge.to) ?? edge.to, parent = edge.source.uri;
|
|
168
|
+
if (!aliases.has(target) || !aliases.has(parent))
|
|
169
|
+
refuse('dependency outside retained snapshot');
|
|
170
|
+
const node = nodes.get(key(edge.source.uri, edge.source.path));
|
|
171
|
+
if (!node)
|
|
172
|
+
refuse('dependency source unavailable');
|
|
173
|
+
const location = syntaxAttribute(node, edge.kind === 'wsdl-import' ? 'location' : 'schemaLocation');
|
|
174
|
+
if (location === undefined)
|
|
175
|
+
continue;
|
|
176
|
+
const slot = key(parent, normalizeWhitespace(location, 'collapse')), previous = imports.get(slot);
|
|
177
|
+
if (previous !== undefined && previous !== target)
|
|
178
|
+
refuse('ambiguous dependency import context');
|
|
179
|
+
imports.set(slot, target);
|
|
180
|
+
dependencies.get(parent).add(target);
|
|
181
|
+
}
|
|
182
|
+
const cache = Object.create(null), prepared = new Set();
|
|
183
|
+
const remaining = new Map(), dependents = new Map(), ready = [];
|
|
184
|
+
for (const [uri, required] of dependencies) {
|
|
185
|
+
check();
|
|
186
|
+
remaining.set(uri, required.size);
|
|
187
|
+
if (!required.size)
|
|
188
|
+
ready.push(uri);
|
|
189
|
+
for (const dependency of required) {
|
|
190
|
+
check();
|
|
191
|
+
let users = dependents.get(dependency);
|
|
192
|
+
if (!users) {
|
|
193
|
+
users = [];
|
|
194
|
+
dependents.set(dependency, users);
|
|
195
|
+
}
|
|
196
|
+
users.push(uri);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
for (let cursor = 0; cursor < ready.length; cursor++) {
|
|
200
|
+
const uri = ready[cursor];
|
|
201
|
+
check();
|
|
202
|
+
const bytes = copyOriginalSchemaResource(source, uri, amount => { check(); budget.chargeWork(amount); });
|
|
203
|
+
budget.chargeWork(4096 + bytes.byteLength * 64);
|
|
204
|
+
const text = decodeMetadataXml(bytes);
|
|
205
|
+
const options = { WSDL_CACHE: cache, wsdl_options: { overrideImportLocation: (_path, parentAlias, location) => {
|
|
206
|
+
check();
|
|
207
|
+
const parent = originals.get(parentAlias);
|
|
208
|
+
const target = parent === undefined ? undefined : imports.get(key(parent, normalizeWhitespace(location, 'collapse')));
|
|
209
|
+
const alias = target === undefined ? undefined : aliases.get(target);
|
|
210
|
+
if (!target || !alias || !prepared.has(target) || !Object.hasOwn(cache, alias))
|
|
211
|
+
return refuse('unowned SOAP metadata import');
|
|
212
|
+
return alias;
|
|
213
|
+
} } };
|
|
214
|
+
const alias = aliases.get(uri), wsdl = new WSDL(text, alias, options);
|
|
215
|
+
cache[alias] = wsdl;
|
|
216
|
+
await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
|
|
217
|
+
check();
|
|
218
|
+
prepared.add(uri);
|
|
219
|
+
for (const dependent of dependents.get(uri) ?? []) {
|
|
220
|
+
check();
|
|
221
|
+
const count = remaining.get(dependent) - 1;
|
|
222
|
+
remaining.set(dependent, count);
|
|
223
|
+
if (count === 0)
|
|
224
|
+
ready.push(dependent);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (prepared.size !== resources.length)
|
|
228
|
+
refuse('cyclic SOAP metadata dependencies');
|
|
229
|
+
const root = aliases.get(source.root.uri);
|
|
230
|
+
if (!root || !Object.hasOwn(cache, root))
|
|
231
|
+
return refuse('original root unavailable');
|
|
232
|
+
return cache[root];
|
|
233
|
+
}
|