@dgac/nmb2b-client
Version:
EUROCONTROL Network Manager B2B SOAP client
73 lines (71 loc) • 3.01 kB
JavaScript
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