UNPKG

@dgac/nmb2b-client

Version:

EUROCONTROL Network Manager B2B SOAP client

73 lines (71 loc) 3.01 kB
import { NMB2BError } from "./NMB2BError.mjs"; import { applyHooks } from "./hooks/index.mjs"; import { assert } from "./assert.mjs"; import { assertOkReply, injectSendTime } from "./internals.mjs"; import { prepareSerializer } from "./transformers/serializer.mjs"; import { prepareSecurity } from "../security.mjs"; import { getSoapEndpoint } from "../config.mjs"; import { getServiceWSDLFilePath } from "./xsd/paths.mjs"; import { deserializer } from "./transformers/index.mjs"; import { logHook } from "./hooks/withLog.mjs"; import { createClientAsync } from "soap"; import { AssertionError } from "node:assert"; //#region src/utils/soap-query-definition.ts function createSoapQueryDefinition(queryDefinition) { return queryDefinition; } async function createSoapService({ serviceName, config, queryDefinitions }) { const WSDL = getServiceWSDLFilePath({ service: serviceName, flavour: config.flavour, XSD_PATH: config.XSD_PATH, xsdEndpoint: config.xsdEndpoint }); const security = prepareSecurity(config); const client = await createClientAsync(WSDL, { customDeserializer: deserializer }); client.setSecurity(security); if (config.endpoint) client.setEndpoint(getSoapEndpoint(config)); return createSoapServiceFromSoapClient({ config, client, queryDefinitions }); } function createSoapServiceFromSoapClient({ client, config, queryDefinitions }) { return { __soapClient: client, config, ...Object.fromEntries(Object.entries(queryDefinitions).map(([queryName, queryDefinition]) => [queryName, buildQueryFunctionFromSoapDefinition({ queryDefinition, client, hooks: [logHook, ...config.hooks] })])) }; } function buildQueryFunctionFromSoapDefinition({ queryDefinition, client, hooks }) { const schema = queryDefinition.getSchema(client); assert(typeof schema === "object" && schema !== null, `Could not find serializer for query ${queryDefinition.service}.${queryDefinition.query}`); const serializer = prepareSerializer(schema); let queryFn = queryDefinition.executeQuery ? queryDefinition.executeQuery(client) : client[`${queryDefinition.query}Async`]; assert(typeof queryFn === "function", `Could not find query function for query ${queryDefinition.service}.${queryDefinition.query}`); queryFn = queryFn.bind(client); return applyHooks({ service: queryDefinition.service, query: queryDefinition.query, hooks, queryFn: async (input, options) => { try { const withSendTime = injectSendTime(input); const [result] = await queryFn(serializer(withSendTime), options); assertOkReply(result); return result; } catch (err) { if (err instanceof AssertionError || err instanceof NMB2BError) throw err; throw new Error(`[Query ${queryDefinition.service}.${queryDefinition.query}] Error thrown during query execution: ${err instanceof Error ? err.message : "Unknown error"}`, { cause: err }); } } }); } //#endregion export { createSoapQueryDefinition, createSoapService }; //# sourceMappingURL=soap-query-definition.mjs.map