UNPKG

@dgac/nmb2b-client

Version:

EUROCONTROL Network Manager B2B SOAP client

1 lines 35.3 kB
{"version":3,"sources":["../../src/Airspace/index.ts","../../src/constants.ts","../../src/security.ts","../../src/utils/debug.ts","../../src/utils/transformers/types.ts","../../src/utils/timeFormats.ts","../../src/utils/transformers/serializer.ts","../../src/utils/transformers/index.ts","../../src/utils/instrumentation/withLog.ts","../../src/utils/instrumentation/index.ts","../../src/utils/NMB2BError.ts","../../src/utils/internals.ts","../../src/Airspace/queryCompleteAIXMDatasets.ts","../../src/Airspace/retrieveAUP.ts","../../src/Airspace/retrieveAUPChain.ts","../../src/Airspace/retrieveEAUPChain.ts"],"sourcesContent":["import { createClient, type Client as SoapClient } from 'soap';\nimport type { Config } from '../config';\nimport { getWSDLPath } from '../constants';\nimport { prepareSecurity } from '../security';\nimport { deserializer as customDeserializer } from '../utils/transformers';\n\nexport const getWSDL = ({\n XSD_PATH,\n flavour,\n}: Pick<Config, 'flavour' | 'XSD_PATH'>) =>\n getWSDLPath({ service: 'AirspaceServices', flavour, XSD_PATH });\n\nexport type AirspaceClient = SoapClient;\n\nfunction createAirspaceServices(config: Config): Promise<AirspaceClient> {\n const WSDL = getWSDL(config);\n const security = prepareSecurity(config);\n\n return new Promise((resolve, reject) => {\n createClient(WSDL, { customDeserializer }, (err, client) => {\n try {\n if (err) {\n reject(\n err instanceof Error\n ? err\n : new Error('Unknown error', { cause: err }),\n );\n return;\n }\n\n client.setSecurity(security);\n\n resolve(client);\n } catch (err) {\n // TODO: Implement a proper debug log message output\n console.log(err);\n reject(\n err instanceof Error\n ? err\n : new Error('Unknown error', { cause: err }),\n );\n return;\n }\n });\n });\n}\n\nimport type { Resolver as QueryCompleteAIXMDatasets } from './queryCompleteAIXMDatasets';\nimport queryCompleteAIXMDatasets from './queryCompleteAIXMDatasets';\nimport type { Resolver as RetrieveAUP } from './retrieveAUP';\nimport retrieveAUP from './retrieveAUP';\nimport type { Resolver as RetrieveAUPChain } from './retrieveAUPChain';\nimport retrieveAUPChain from './retrieveAUPChain';\nimport type { Resolver as RetrieveEAUPChain } from './retrieveEAUPChain';\nimport retrieveEAUPChain from './retrieveEAUPChain';\n\nimport type { BaseServiceInterface } from '../Common/ServiceInterface';\n\nexport interface AirspaceService extends BaseServiceInterface {\n queryCompleteAIXMDatasets: QueryCompleteAIXMDatasets;\n retrieveAUPChain: RetrieveAUPChain;\n retrieveEAUPChain: RetrieveEAUPChain;\n retrieveAUP: RetrieveAUP;\n}\n\nexport function getAirspaceClient(config: Config): Promise<AirspaceService> {\n return createAirspaceServices(config).then((client) => ({\n __soapClient: client,\n config,\n queryCompleteAIXMDatasets: queryCompleteAIXMDatasets(client),\n retrieveAUPChain: retrieveAUPChain(client),\n retrieveEAUPChain: retrieveEAUPChain(client),\n retrieveAUP: retrieveAUP(client),\n }));\n}\n","import path from 'path';\nexport type B2BFlavour = 'OPS' | 'PREOPS';\n\nexport const B2B_VERSION = '27.0.0';\nexport const B2BFlavours = ['OPS', 'PREOPS'];\n\nexport const getWSDLPath = ({\n service,\n flavour,\n XSD_PATH,\n}: {\n service: string;\n flavour: B2BFlavour;\n XSD_PATH: string;\n}): string =>\n path.join(\n XSD_PATH,\n `${B2B_VERSION}/${service}_${flavour}_${B2B_VERSION}.wsdl`,\n );\n","import invariant from 'invariant';\nimport d from './utils/debug';\nconst debug = d('security');\nimport type { Config } from './config';\nimport type { ISecurity } from 'soap';\nimport {\n ClientSSLSecurity,\n ClientSSLSecurityPFX,\n BasicAuthSecurity,\n} from 'soap';\nimport fs from 'fs';\n\ninterface PfxSecurity {\n pfx: Buffer;\n passphrase: string;\n}\n\ninterface PemSecurity {\n cert: Buffer;\n key: Buffer;\n passphrase?: string;\n}\n\ninterface ApiGwSecurity {\n apiKeyId: string;\n apiSecretKey: string;\n}\n\nexport type Security = PfxSecurity | PemSecurity | ApiGwSecurity;\n\nexport function isValidSecurity(obj: unknown): obj is Security {\n invariant(!!obj && typeof obj === 'object', 'Must be an object');\n\n if ('apiKeyId' in obj) {\n invariant(\n !!obj.apiKeyId &&\n typeof obj.apiKeyId === 'string' &&\n obj.apiKeyId.length > 0,\n 'security.apiKeyId must be a string with a length > 0',\n );\n\n invariant(\n 'apiSecretKey' in obj &&\n typeof obj.apiSecretKey === 'string' &&\n obj.apiSecretKey.length > 0,\n 'security.apiSecretKey must be defined when using security.apiKeyId',\n );\n\n return true;\n }\n\n invariant(\n ('pfx' in obj && Buffer.isBuffer(obj.pfx)) ||\n ('cert' in obj && Buffer.isBuffer(obj.cert)),\n 'security.pfx or security.cert must be buffers',\n );\n\n if ('cert' in obj && obj.cert) {\n invariant(\n 'key' in obj && obj.key && Buffer.isBuffer(obj.key),\n 'security.key must be a buffer if security.pem is defined',\n );\n }\n\n return true;\n}\n\nexport function prepareSecurity(config: Config): ISecurity {\n const { security } = config;\n\n if ('apiKeyId' in security) {\n const { apiKeyId, apiSecretKey } = security;\n debug('Using ApiGateway security');\n return new BasicAuthSecurity(apiKeyId, apiSecretKey);\n } else if ('pfx' in security) {\n const { pfx, passphrase } = security;\n debug('Using PFX certificates');\n return new ClientSSLSecurityPFX(pfx, passphrase);\n } else if ('cert' in security) {\n debug('Using PEM certificates');\n const { key, cert, passphrase } = security;\n return new ClientSSLSecurity(\n key,\n cert,\n undefined,\n passphrase ? { passphrase } : null,\n );\n }\n\n throw new Error('Invalid security object');\n}\n\nlet envSecurity: Security | undefined;\n\n/**\n * Create a security objet from environment variables\n *\n * Will cache data for future use.\n *\n * @returns Security configuration\n */\nexport function fromEnv(): Security {\n if (envSecurity) {\n return envSecurity;\n }\n\n const { B2B_CERT, B2B_API_KEY_ID, B2B_API_SECRET_KEY } = process.env;\n\n if (!B2B_CERT && !B2B_API_KEY_ID) {\n throw new Error(\n 'Please define a B2B_CERT or a B2B_API_KEY_ID environment variable',\n );\n }\n\n if (B2B_API_KEY_ID) {\n if (!B2B_API_SECRET_KEY) {\n throw new Error(\n `When using B2B_API_KEY_ID, a B2B_API_SECRET_KEY must be defined`,\n );\n }\n\n return {\n apiKeyId: B2B_API_KEY_ID,\n apiSecretKey: B2B_API_SECRET_KEY,\n };\n }\n\n if (!B2B_CERT) {\n throw new Error('Should never happen');\n }\n\n if (!fs.existsSync(B2B_CERT)) {\n throw new Error(`${B2B_CERT} is not a valid certificate file`);\n }\n\n const pfxOrPem = fs.readFileSync(B2B_CERT);\n\n if (!process.env.B2B_CERT_FORMAT || process.env.B2B_CERT_FORMAT === 'pfx') {\n envSecurity = {\n pfx: pfxOrPem,\n passphrase: process.env.B2B_CERT_PASSPHRASE ?? '',\n };\n\n return envSecurity;\n } else if (process.env.B2B_CERT_FORMAT === 'pem') {\n if (!process.env.B2B_CERT_KEY || !fs.existsSync(process.env.B2B_CERT_KEY)) {\n throw new Error(\n 'Please define a valid B2B_CERT_KEY environment variable',\n );\n }\n\n envSecurity = {\n cert: pfxOrPem,\n key: fs.readFileSync(process.env.B2B_CERT_KEY),\n };\n\n if (process.env.B2B_CERT_PASSPHRASE) {\n envSecurity = {\n ...envSecurity,\n passphrase: process.env.B2B_CERT_PASSPHRASE,\n };\n return envSecurity;\n }\n\n return envSecurity;\n }\n\n throw new Error('Unsupported B2B_CERT_FORMAT, must be pfx or pem');\n}\n\n/**\n * Convenience function to clear the cached security objet\n */\nexport function clearCache(): void {\n envSecurity = undefined;\n}\n","import d from 'debug';\nconst PREFIX = '@dgac/nmb2b-client';\nconst debug = d(PREFIX);\n\nfunction log(ns?: string) {\n if (!ns) {\n return debug;\n }\n\n return debug.extend(ns);\n}\n\nexport default log;\n","import { UTCDate } from '@date-fns/utc';\nimport { format } from 'date-fns';\nimport * as timeFormats from '../timeFormats';\n\nconst outputBase = {\n integer: (text: string) => {\n return parseInt(text, 10);\n },\n /**\n *\n * Parse a NMB2B date/datetime.\n *\n * All datetimes are assumed to be UTC.\n *\n * Per NM B2B documentation, we only need to support these formats:\n * - DateTimeMinute: YYYY-MM-DD hh:mm\n * - DateTimeSecond: YYYY-MM-DD hh:mm:ss\n * - DateYearMonthDay: YYYY-MM-DD\n *\n * All dates are\n * @param text NM B2B Date string\n * @returns Parsed Date instance\n */\n date: (text: string) => {\n // eslint-disable-next-line prefer-const\n let [date, time] = text.split(' ');\n\n if (!time) {\n return new Date(text);\n }\n\n if (time.length === 5) {\n time += ':00';\n }\n\n return new Date(`${date}T${time}Z`);\n },\n};\n\ninterface SerDe {\n [key: string]: {\n input: null | ((input: any, ctx?: any) => any);\n output: null | ((input: any, ctx?: any) => any);\n };\n}\n\nexport const types = {\n FlightLevel_DataType: {\n input: null,\n output: outputBase.integer,\n },\n DurationHourMinute: {\n input: (d: number): string => {\n const totalMinutes = Math.floor(d / 60);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return `${hours}`.padStart(2, '0') + `${minutes}`.padStart(2, '0');\n },\n output: (s: string): number => {\n const hours = parseInt(s.slice(0, 2), 10);\n const minutes = parseInt(s.slice(2), 10);\n\n return 60 * (60 * hours + minutes);\n },\n },\n DurationHourMinuteSecond: {\n input: (d: number): string => {\n const totalMinutes = Math.floor(d / 60);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return (\n `${hours}`.padStart(2, '0') +\n `${minutes}`.padStart(2, '0') +\n `${d % 60}`.padStart(2, '0')\n );\n },\n output: (s: string): number => {\n const hours = parseInt(s.slice(0, 2), 10);\n const minutes = parseInt(s.slice(2, 4), 10);\n const seconds = parseInt(s.slice(4), 10);\n\n return 3600 * hours + 60 * minutes + seconds;\n },\n },\n DurationMinute: {\n input: (d: number): number => Math.floor(d / 60),\n output: (d: number): number => 60 * d,\n },\n CountsValue: {\n input: null,\n output: outputBase.integer,\n },\n DateTimeMinute: {\n input: (d: Date): string => format(new UTCDate(d), timeFormats.timeFormat),\n output: outputBase.date,\n },\n DateYearMonthDay: {\n input: (d: Date): string => format(new UTCDate(d), timeFormats.dateFormat),\n output: outputBase.date,\n },\n DateTimeSecond: {\n input: (d: Date): string =>\n format(new UTCDate(d), timeFormats.timeFormatWithSeconds),\n output: outputBase.date,\n },\n DistanceNM: {\n input: null,\n output: outputBase.integer,\n },\n DistanceM: {\n input: null,\n output: outputBase.integer,\n },\n Bearing: {\n input: null,\n output: outputBase.integer,\n },\n OTMVThreshold: {\n input: null,\n output: outputBase.integer,\n },\n} satisfies SerDe;\n","export const timeFormat = 'yyyy-MM-dd HH:mm';\nexport const dateFormat = 'yyyy-MM-dd';\nexport const timeFormatWithSeconds = timeFormat + ':ss';\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { types } from './types';\nimport { piped, identity, evolve, map } from 'remeda';\n\nexport function prepareSerializer<T>(schema: any): (input: T) => T {\n const transformer = prepareTransformer(schema);\n return piped(\n reorderKeys(schema),\n transformer ? evolve(transformer) : identity,\n // (obj) => {\n // console.log(JSON.stringify(obj, null, 2));\n // return obj;\n // },\n ) as any as (input: T) => T;\n}\n\nfunction reduceXSDType(str: string): string {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return str.split('|')[0]!;\n}\n\ninterface Schema {\n [k: string]: string | Schema;\n}\n\ninterface Transformer {\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n [k: string]: (input: any) => any | Transformer;\n}\n\nfunction prepareTransformer(schema: Schema): null | Transformer {\n return Object.keys(schema).reduce((prev: null | Transformer, curr) => {\n let key = curr;\n let isArray = false;\n\n /**\n * If the current key marks an array, we need to map over the values instead of just trying\n * to transform the value.\n *\n * We also need to assign the correct key to the transformer.\n */\n if (curr.endsWith('[]')) {\n key = curr.slice(0, -2);\n isArray = true;\n }\n\n if (typeof schema[curr] === 'string') {\n const type = reduceXSDType(schema[curr]);\n\n if ((types as any)[type]?.input) {\n const transformer = (types as any)[type].input;\n return { ...prev, [key]: isArray ? map(transformer) : transformer };\n }\n } else if (typeof schema[curr] === 'object') {\n const subItem = prepareTransformer(schema[curr]);\n if (subItem) {\n return {\n ...prev,\n [key]: isArray ? map(evolve(subItem)) : subItem,\n };\n }\n }\n\n return prev;\n }, null);\n}\n\nexport function reorderKeys<T extends Schema, O extends { [key: string]: any }>(\n schema: T,\n): (obj: O) => O {\n return (obj: O): O => {\n // console.log(JSON.stringify(schema, null, 2));\n // console.log(JSON.stringify(obj, null, 2));\n\n // Loop through schema, pull property from Object\n return Object.keys(schema).reduce<any>((prev, curr) => {\n const lookupKey: string = curr.replace(/\\[\\]$/, '');\n const isArrayExpected: boolean = curr.endsWith('[]');\n\n if (!(lookupKey in obj)) {\n return prev;\n }\n\n const currSchema = schema[curr];\n\n if (typeof currSchema === 'string') {\n prev[lookupKey] = obj[lookupKey];\n return prev;\n }\n\n if (typeof currSchema === 'object') {\n if (\n Object.keys(currSchema).filter(\n (k) => k !== 'targetNSAlias' && k !== 'targetNamespace',\n ).length\n ) {\n prev[lookupKey] =\n isArrayExpected && obj[lookupKey] && Array.isArray(obj[lookupKey])\n ? obj[lookupKey].map(reorderKeys(currSchema))\n : reorderKeys(currSchema)(obj[lookupKey]);\n return prev;\n }\n\n prev[lookupKey] = obj[lookupKey];\n return prev;\n }\n\n return prev;\n }, {});\n };\n}\n","import { types } from './types';\nexport { prepareSerializer } from './serializer';\n\ntype T = typeof types;\n\ntype WithOutput = {\n [K in keyof T]: T[K]['output'] extends null ? never : K;\n}[keyof T];\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nexport const deserializer: { [K in WithOutput]: T[K]['output'] } & Record<\n string,\n any\n> = Object.entries(types).reduce<any>((prev, [key, { output }]) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (output) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n prev[key] = output;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return prev;\n}, {});\n","import type { Instrumentor } from './';\nimport d from '../debug';\n\nexport function withLog<Input, Output>(\n namespace: string,\n): Instrumentor<Input, Output> {\n const debug = d(namespace);\n\n return (fn) => (values, options) => {\n if (values) {\n debug('Called with input %o', values);\n } else {\n debug('Called');\n }\n\n return fn(values, options).then(\n (res) => {\n debug('Succeded');\n return res;\n },\n (err) => {\n debug('Failed');\n return Promise.reject(\n err instanceof Error\n ? err\n : new Error('Unknown error', { cause: err }),\n );\n },\n );\n };\n}\n","// import withLog from './withLog';\nimport type { SoapOptions } from '../../soap';\nimport { withLog } from './withLog';\nimport { pipe } from 'remeda';\n\ntype SoapQuery<Input, Output> = (\n input?: Input,\n options?: SoapOptions,\n) => Promise<Output>;\n\nexport type Instrumentor<Input, Output> = (\n fn: SoapQuery<Input, Output>,\n) => SoapQuery<Input, Output>;\n\nexport function instrument<Input, Output>({\n service,\n query,\n}: {\n service: string;\n query: string;\n}) {\n return (fn: SoapQuery<Input, Output>) =>\n pipe(fn, withLog<Input, Output>(`${service}:${query}`));\n}\n","import type { B2B_Error, Reply, ReplyStatus } from '../Common/types';\n\n/**\n * Represents an error response received from NM B2B\n */\nexport class NMB2BError extends Error {\n /**\n * UTC time at which the request was received at NM.\n *\n * Always set when an XML reply is returned, regardless of the possible exceptions that occurred within the request processing.\n */\n declare requestReceptionTime?: Date;\n\n /**\n * Identification of the request. This id is not unique across time: the request is uniquely identified via two attributes: `requestReceptionTime` and `requestId`.\n *\n * Always set when an XML reply is returned, regardless of the possible exceptions that occurred within the request processing.\n */\n declare requestId?: string;\n\n /**\n * UTC time at which NM has sent the reply.\n *\n * Always set when an XML reply is returned, regardless of the possible exceptions that occurred within the request processing.\n */\n declare sendTime?: Date;\n\n /**\n * Status code explaining the error.\n */\n declare status: Exclude<ReplyStatus, 'OK'>;\n\n /**\n * Contains the input validation errors, if any.\n * Set to null if the request successfully passed input validations (i.e. status is not set to `INVALID_INPUT`).\n */\n declare inputValidationErrors?: Array<B2B_Error>;\n\n /**\n * Contains the output validation errors, if any.\n * Set to null if the request successfully passed output validations (i.e. status is not set to `INVALID_OUTPUT`).\n */\n declare outputValidationErrors?: Array<B2B_Error>;\n\n /**\n * Warnings, if any\n */\n declare warnings?: Array<B2B_Error>;\n\n /**\n * Describes an error caused by a SLA violation.\n *\n */\n declare slaError?: B2B_Error;\n\n declare reason?: string;\n\n constructor({\n reply,\n }: {\n reply: Reply & { status: Exclude<ReplyStatus, 'OK'> };\n }) {\n super();\n\n if (reply.requestId) {\n this.requestId = reply.requestId;\n }\n\n if (reply.requestReceptionTime) {\n this.requestReceptionTime = reply.requestReceptionTime;\n }\n\n if (reply.sendTime) {\n this.sendTime = reply.sendTime;\n }\n\n if (reply.inputValidationErrors) {\n this.inputValidationErrors = reply.inputValidationErrors;\n }\n\n if (reply.warnings) {\n this.warnings = reply.warnings;\n }\n\n if (reply.slaError) {\n this.slaError = reply.slaError;\n }\n\n if (reply.reason) {\n this.reason = reply.reason;\n }\n this.status = reply.status;\n this.message = this.status;\n\n if (this.reason) {\n this.message = `${this.message}: ${this.reason}`;\n }\n }\n}\n","import type { Reply, ReplyStatus, Request } from '../Common/types';\nimport { NMB2BError } from './NMB2BError';\n\nexport function injectSendTime<\n T extends Record<string, any> | null | undefined,\n>(values: T): Request {\n const sendTime = new Date();\n\n if (!values || typeof values !== 'object') {\n return { sendTime };\n }\n\n return { sendTime, ...values };\n}\n\ntype Cb = (...args: any[]) => void;\n\nexport function responseStatusHandler(resolve: Cb, reject: Cb) {\n return (err: unknown, reply: Reply) => {\n if (err) {\n reject(err);\n return;\n }\n\n if (reply.status === 'OK') {\n resolve(reply);\n return;\n } else {\n const err = new NMB2BError({\n reply: reply as Reply & { status: Exclude<ReplyStatus, 'OK'> },\n });\n reject(err);\n return;\n }\n };\n}\n","import type { SoapOptions } from '../soap';\nimport { instrument } from '../utils/instrumentation';\nimport { injectSendTime, responseStatusHandler } from '../utils/internals';\nimport { prepareSerializer } from '../utils/transformers';\nimport type { AirspaceClient } from './';\n\nimport type {\n CompleteAIXMDatasetReply,\n CompleteAIXMDatasetRequest,\n} from './types';\n\nexport type { CompleteAIXMDatasetReply, CompleteAIXMDatasetRequest } from './types';\n\ntype Values = CompleteAIXMDatasetRequest;\ntype Result = CompleteAIXMDatasetReply;\n\nexport type Resolver = (\n values: CompleteAIXMDatasetRequest,\n options?: SoapOptions,\n) => Promise<CompleteAIXMDatasetReply>;\n\nexport default function prepareQueryCompleteAIXMDatasets(\n client: AirspaceClient,\n): Resolver {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const schema =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n client.describe().AirspaceStructureService.AirspaceStructurePort\n .queryCompleteAIXMDatasets.input;\n const serializer = prepareSerializer(schema);\n\n return instrument<Values, Result>({\n service: 'Airspace',\n query: 'queryCompleteAIXMDatasets',\n })(\n (values, options) =>\n new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.queryCompleteAIXMDatasets(\n serializer(injectSendTime(values)),\n options,\n responseStatusHandler(resolve, reject),\n );\n }),\n );\n}\n","import type { SoapOptions } from '../soap';\nimport { instrument } from '../utils/instrumentation';\nimport { injectSendTime, responseStatusHandler } from '../utils/internals';\nimport { prepareSerializer } from '../utils/transformers';\nimport type { AirspaceClient } from './';\n\nimport type { AUPRetrievalReply, AUPRetrievalRequest } from './types';\nexport type { AUPRetrievalReply, AUPRetrievalRequest };\n\ntype Values = AUPRetrievalRequest;\ntype Result = AUPRetrievalReply;\n\nexport type Resolver = (\n values?: Values,\n options?: SoapOptions,\n) => Promise<Result>;\n\nexport default function prepareRetrieveAUP(client: AirspaceClient): Resolver {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const schema =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n client.describe().AirspaceAvailabilityService.AirspaceAvailabilityPort\n .retrieveAUP.input;\n const serializer = prepareSerializer(schema);\n\n return instrument<Values, Result>({\n service: 'Airspace',\n query: 'retrieveAUP',\n })(\n (values, options) =>\n new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.retrieveAUP(\n serializer(injectSendTime(values)),\n options,\n responseStatusHandler(resolve, reject),\n );\n }),\n );\n}\n","import type { SoapOptions } from '../soap';\nimport { instrument } from '../utils/instrumentation';\nimport { injectSendTime, responseStatusHandler } from '../utils/internals';\nimport { prepareSerializer } from '../utils/transformers';\nimport type { AirspaceClient } from './';\nimport type { AUPChainRetrievalReply, AUPChainRetrievalRequest } from './types';\nexport type { AUPChainRetrievalReply, AUPChainRetrievalRequest };\n\ntype Values = AUPChainRetrievalRequest;\ntype Result = AUPChainRetrievalReply;\n\nexport type Resolver = (\n values?: Values,\n options?: SoapOptions,\n) => Promise<Result>;\n\nexport default function prepareRetrieveAUPChain(\n client: AirspaceClient,\n): Resolver {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const schema =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n client.describe().AirspaceAvailabilityService.AirspaceAvailabilityPort\n .retrieveAUPChain.input;\n const serializer = prepareSerializer(schema);\n\n return instrument<Values, Result>({\n service: 'Airspace',\n query: 'retrieveAUPChain',\n })(\n (values, options) =>\n new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.retrieveAUPChain(\n serializer(injectSendTime(values)),\n options,\n responseStatusHandler(resolve, reject),\n );\n }),\n );\n}\n","import type { SoapOptions } from '../soap';\nimport { instrument } from '../utils/instrumentation';\nimport { injectSendTime, responseStatusHandler } from '../utils/internals';\nimport { prepareSerializer } from '../utils/transformers';\nimport type { AirspaceClient } from './';\nimport type {\n EAUPChainRetrievalReply,\n EAUPChainRetrievalRequest,\n} from './types';\n\nexport type { EAUPChainRetrievalReply, EAUPChainRetrievalRequest };\n\ntype Values = EAUPChainRetrievalRequest;\ntype Result = EAUPChainRetrievalReply;\n\nexport type Resolver = (\n values?: Values,\n options?: SoapOptions,\n) => Promise<Result>;\n\nexport default function prepareRetrieveEAUPChain(\n client: AirspaceClient,\n): Resolver {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const schema =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n client.describe().AirspaceAvailabilityService.AirspaceAvailabilityPort\n .retrieveEAUPChain.input;\n const serializer = prepareSerializer(schema);\n\n return instrument<Values, Result>({\n service: 'Airspace',\n query: 'retrieveEAUPChain',\n })(\n (values, options) =>\n new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.retrieveEAUPChain(\n serializer(injectSendTime(values)),\n options,\n responseStatusHandler(resolve, reject),\n );\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAwD;;;ACAxD,kBAAiB;AAGV,IAAM,cAAc;AAGpB,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,MAKE,YAAAC,QAAK;AAAA,EACH;AAAA,EACA,GAAG,WAAW,IAAI,OAAO,IAAI,OAAO,IAAI,WAAW;AACrD;;;AClBF,uBAAsB;;;ACAtB,mBAAc;AACd,IAAM,SAAS;AACf,IAAM,YAAQ,aAAAC,SAAE,MAAM;AAEtB,SAAS,IAAI,IAAa;AACxB,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,OAAO,EAAE;AACxB;AAEA,IAAO,gBAAQ;;;ADPf,kBAIO;AACP,gBAAe;AARf,IAAMC,SAAQ,cAAE,UAAU;AAiEnB,SAAS,gBAAgB,QAA2B;AACzD,QAAM,EAAE,SAAS,IAAI;AAErB,MAAI,cAAc,UAAU;AAC1B,UAAM,EAAE,UAAU,aAAa,IAAI;AACnC,IAAAC,OAAM,2BAA2B;AACjC,WAAO,IAAI,8BAAkB,UAAU,YAAY;AAAA,EACrD,WAAW,SAAS,UAAU;AAC5B,UAAM,EAAE,KAAK,WAAW,IAAI;AAC5B,IAAAA,OAAM,wBAAwB;AAC9B,WAAO,IAAI,iCAAqB,KAAK,UAAU;AAAA,EACjD,WAAW,UAAU,UAAU;AAC7B,IAAAA,OAAM,wBAAwB;AAC9B,UAAM,EAAE,KAAK,MAAM,WAAW,IAAI;AAClC,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,EAAE,WAAW,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,yBAAyB;AAC3C;;;AE1FA,iBAAwB;AACxB,sBAAuB;;;ACDhB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,wBAAwB,aAAa;;;ADElD,IAAM,aAAa;AAAA,EACjB,SAAS,CAAC,SAAiB;AACzB,WAAO,SAAS,MAAM,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,CAAC,SAAiB;AAEtB,QAAI,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG;AAEjC,QAAI,CAAC,MAAM;AACT,aAAO,IAAI,KAAK,IAAI;AAAA,IACtB;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ;AAAA,IACV;AAEA,WAAO,oBAAI,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG;AAAA,EACpC;AACF;AASO,IAAM,QAAQ;AAAA,EACnB,sBAAsB;AAAA,IACpB,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,oBAAoB;AAAA,IAClB,OAAO,CAACC,OAAsB;AAC5B,YAAM,eAAe,KAAK,MAAMA,KAAI,EAAE;AACtC,YAAM,QAAQ,KAAK,MAAM,eAAe,EAAE;AAC1C,YAAM,UAAU,eAAe;AAC/B,aAAO,GAAG,KAAK,GAAG,SAAS,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,GAAG;AAAA,IACnE;AAAA,IACA,QAAQ,CAAC,MAAsB;AAC7B,YAAM,QAAQ,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,YAAM,UAAU,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE;AAEvC,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB,OAAO,CAACA,OAAsB;AAC5B,YAAM,eAAe,KAAK,MAAMA,KAAI,EAAE;AACtC,YAAM,QAAQ,KAAK,MAAM,eAAe,EAAE;AAC1C,YAAM,UAAU,eAAe;AAC/B,aACE,GAAG,KAAK,GAAG,SAAS,GAAG,GAAG,IAC1B,GAAG,OAAO,GAAG,SAAS,GAAG,GAAG,IAC5B,GAAGA,KAAI,EAAE,GAAG,SAAS,GAAG,GAAG;AAAA,IAE/B;AAAA,IACA,QAAQ,CAAC,MAAsB;AAC7B,YAAM,QAAQ,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACxC,YAAM,UAAU,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAC1C,YAAM,UAAU,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE;AAEvC,aAAO,OAAO,QAAQ,KAAK,UAAU;AAAA,IACvC;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO,CAACA,OAAsB,KAAK,MAAMA,KAAI,EAAE;AAAA,IAC/C,QAAQ,CAACA,OAAsB,KAAKA;AAAA,EACtC;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO,CAACA,WAAoB,wBAAO,IAAI,mBAAQA,EAAC,GAAe,UAAU;AAAA,IACzE,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,kBAAkB;AAAA,IAChB,OAAO,CAACA,WAAoB,wBAAO,IAAI,mBAAQA,EAAC,GAAe,UAAU;AAAA,IACzE,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO,CAACA,WACN,wBAAO,IAAI,mBAAQA,EAAC,GAAe,qBAAqB;AAAA,IAC1D,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,EACrB;AACF;;;AEpHA,oBAA6C;AAEtC,SAAS,kBAAqB,QAA8B;AACjE,QAAM,cAAc,mBAAmB,MAAM;AAC7C,aAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,kBAAc,sBAAO,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC;AACF;AAEA,SAAS,cAAc,KAAqB;AAE1C,SAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AACzB;AAWA,SAAS,mBAAmB,QAAoC;AAC9D,SAAO,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,MAA0B,SAAS;AACpE,QAAI,MAAM;AACV,QAAI,UAAU;AAQd,QAAI,KAAK,SAAS,IAAI,GAAG;AACvB,YAAM,KAAK,MAAM,GAAG,EAAE;AACtB,gBAAU;AAAA,IACZ;AAEA,QAAI,OAAO,OAAO,IAAI,MAAM,UAAU;AACpC,YAAM,OAAO,cAAc,OAAO,IAAI,CAAC;AAEvC,UAAK,MAAc,IAAI,GAAG,OAAO;AAC/B,cAAM,cAAe,MAAc,IAAI,EAAE;AACzC,eAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,cAAU,mBAAI,WAAW,IAAI,YAAY;AAAA,MACpE;AAAA,IACF,WAAW,OAAO,OAAO,IAAI,MAAM,UAAU;AAC3C,YAAM,UAAU,mBAAmB,OAAO,IAAI,CAAC;AAC/C,UAAI,SAAS;AACX,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,cAAU,uBAAI,sBAAO,OAAO,CAAC,IAAI;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,IAAI;AACT;AAEO,SAAS,YACd,QACe;AACf,SAAO,CAAC,QAAc;AAKpB,WAAO,OAAO,KAAK,MAAM,EAAE,OAAY,CAAC,MAAM,SAAS;AACrD,YAAM,YAAoB,KAAK,QAAQ,SAAS,EAAE;AAClD,YAAM,kBAA2B,KAAK,SAAS,IAAI;AAEnD,UAAI,EAAE,aAAa,MAAM;AACvB,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,OAAO,IAAI;AAE9B,UAAI,OAAO,eAAe,UAAU;AAClC,aAAK,SAAS,IAAI,IAAI,SAAS;AAC/B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,eAAe,UAAU;AAClC,YACE,OAAO,KAAK,UAAU,EAAE;AAAA,UACtB,CAAC,MAAM,MAAM,mBAAmB,MAAM;AAAA,QACxC,EAAE,QACF;AACA,eAAK,SAAS,IACZ,mBAAmB,IAAI,SAAS,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,IAC7D,IAAI,SAAS,EAAE,IAAI,YAAY,UAAU,CAAC,IAC1C,YAAY,UAAU,EAAE,IAAI,SAAS,CAAC;AAC5C,iBAAO;AAAA,QACT;AAEA,aAAK,SAAS,IAAI,IAAI,SAAS;AAC/B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;;;ACvGO,IAAM,eAGT,OAAO,QAAQ,KAAK,EAAE,OAAY,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM;AAEjE,MAAI,QAAQ;AAEV,SAAK,GAAG,IAAI;AAAA,EACd;AAGA,SAAO;AACT,GAAG,CAAC,CAAC;;;ACnBE,SAAS,QACd,WAC6B;AAC7B,QAAMC,SAAQ,cAAE,SAAS;AAEzB,SAAO,CAAC,OAAO,CAAC,QAAQ,YAAY;AAClC,QAAI,QAAQ;AACV,MAAAA,OAAM,wBAAwB,MAAM;AAAA,IACtC,OAAO;AACL,MAAAA,OAAM,QAAQ;AAAA,IAChB;AAEA,WAAO,GAAG,QAAQ,OAAO,EAAE;AAAA,MACzB,CAAC,QAAQ;AACP,QAAAA,OAAM,UAAU;AAChB,eAAO;AAAA,MACT;AAAA,MACA,CAAC,QAAQ;AACP,QAAAA,OAAM,QAAQ;AACd,eAAO,QAAQ;AAAA,UACb,eAAe,QACX,MACA,IAAI,MAAM,iBAAiB,EAAE,OAAO,IAAI,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC3BA,IAAAC,iBAAqB;AAWd,SAAS,WAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAGG;AACD,SAAO,CAAC,WACN,qBAAK,IAAI,QAAuB,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;AAC1D;;;AClBO,IAAM,aAAN,cAAyB,MAAM;AAAA,EAoDpC,YAAY;AAAA,IACV;AAAA,EACF,GAEG;AACD,UAAM;AAEN,QAAI,MAAM,WAAW;AACnB,WAAK,YAAY,MAAM;AAAA,IACzB;AAEA,QAAI,MAAM,sBAAsB;AAC9B,WAAK,uBAAuB,MAAM;AAAA,IACpC;AAEA,QAAI,MAAM,UAAU;AAClB,WAAK,WAAW,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,uBAAuB;AAC/B,WAAK,wBAAwB,MAAM;AAAA,IACrC;AAEA,QAAI,MAAM,UAAU;AAClB,WAAK,WAAW,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,UAAU;AAClB,WAAK,WAAW,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,QAAQ;AAChB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU,KAAK;AAEpB,QAAI,KAAK,QAAQ;AACf,WAAK,UAAU,GAAG,KAAK,OAAO,KAAK,KAAK,MAAM;AAAA,IAChD;AAAA,EACF;AACF;;;AC/FO,SAAS,eAEd,QAAoB;AACpB,QAAM,WAAW,oBAAI,KAAK;AAE1B,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,SAAS;AAAA,EACpB;AAEA,SAAO,EAAE,UAAU,GAAG,OAAO;AAC/B;AAIO,SAAS,sBAAsB,SAAa,QAAY;AAC7D,SAAO,CAAC,KAAc,UAAiB;AACrC,QAAI,KAAK;AACP,aAAO,GAAG;AACV;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,MAAM;AACzB,cAAQ,KAAK;AACb;AAAA,IACF,OAAO;AACL,YAAMC,OAAM,IAAI,WAAW;AAAA,QACzB;AAAA,MACF,CAAC;AACD,aAAOA,IAAG;AACV;AAAA,IACF;AAAA,EACF;AACF;;;ACde,SAAR,iCACL,QACU;AAEV,QAAM;AAAA;AAAA,IAEJ,OAAO,SAAS,EAAE,yBAAyB,sBACxC,0BAA0B;AAAA;AAC/B,QAAM,aAAa,kBAAkB,MAAM;AAE3C,SAAO,WAA2B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAAA,IACC,CAAC,QAAQ,YACP,IAAI,QAAQ,CAAC,SAAS,WAAW;AAE/B,aAAO;AAAA,QACL,WAAW,eAAe,MAAM,CAAC;AAAA,QACjC;AAAA,QACA,sBAAsB,SAAS,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACL;AACF;;;AC5Be,SAAR,mBAAoC,QAAkC;AAE3E,QAAM;AAAA;AAAA,IAEJ,OAAO,SAAS,EAAE,4BAA4B,yBAC3C,YAAY;AAAA;AACjB,QAAM,aAAa,kBAAkB,MAAM;AAE3C,SAAO,WAA2B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAAA,IACC,CAAC,QAAQ,YACP,IAAI,QAAQ,CAAC,SAAS,WAAW;AAE/B,aAAO;AAAA,QACL,WAAW,eAAe,MAAM,CAAC;AAAA,QACjC;AAAA,QACA,sBAAsB,SAAS,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACL;AACF;;;ACvBe,SAAR,wBACL,QACU;AAEV,QAAM;AAAA;AAAA,IAEJ,OAAO,SAAS,EAAE,4BAA4B,yBAC3C,iBAAiB;AAAA;AACtB,QAAM,aAAa,kBAAkB,MAAM;AAE3C,SAAO,WAA2B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAAA,IACC,CAAC,QAAQ,YACP,IAAI,QAAQ,CAAC,SAAS,WAAW;AAE/B,aAAO;AAAA,QACL,WAAW,eAAe,MAAM,CAAC;AAAA,QACjC;AAAA,QACA,sBAAsB,SAAS,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACL;AACF;;;ACpBe,SAAR,yBACL,QACU;AAEV,QAAM;AAAA;AAAA,IAEJ,OAAO,SAAS,EAAE,4BAA4B,yBAC3C,kBAAkB;AAAA;AACvB,QAAM,aAAa,kBAAkB,MAAM;AAE3C,SAAO,WAA2B;AAAA,IAChC,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAAA,IACC,CAAC,QAAQ,YACP,IAAI,QAAQ,CAAC,SAAS,WAAW;AAE/B,aAAO;AAAA,QACL,WAAW,eAAe,MAAM,CAAC;AAAA,QACjC;AAAA,QACA,sBAAsB,SAAS,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACL;AACF;;;AftCO,IAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA;AACF,MACE,YAAY,EAAE,SAAS,oBAAoB,SAAS,SAAS,CAAC;AAIhE,SAAS,uBAAuB,QAAyC;AACvE,QAAM,OAAO,QAAQ,MAAM;AAC3B,QAAM,WAAW,gBAAgB,MAAM;AAEvC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,mCAAa,MAAM,EAAE,iCAAmB,GAAG,CAAC,KAAK,WAAW;AAC1D,UAAI;AACF,YAAI,KAAK;AACP;AAAA,YACE,eAAe,QACX,MACA,IAAI,MAAM,iBAAiB,EAAE,OAAO,IAAI,CAAC;AAAA,UAC/C;AACA;AAAA,QACF;AAEA,eAAO,YAAY,QAAQ;AAE3B,gBAAQ,MAAM;AAAA,MAChB,SAASC,MAAK;AAEZ,gBAAQ,IAAIA,IAAG;AACf;AAAA,UACEA,gBAAe,QACXA,OACA,IAAI,MAAM,iBAAiB,EAAE,OAAOA,KAAI,CAAC;AAAA,QAC/C;AACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAoBO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO,uBAAuB,MAAM,EAAE,KAAK,CAAC,YAAY;AAAA,IACtD,cAAc;AAAA,IACd;AAAA,IACA,2BAA2B,iCAA0B,MAAM;AAAA,IAC3D,kBAAkB,wBAAiB,MAAM;AAAA,IACzC,mBAAmB,yBAAkB,MAAM;AAAA,IAC3C,aAAa,mBAAY,MAAM;AAAA,EACjC,EAAE;AACJ;","names":["import_soap","path","d","debug","debug","d","debug","import_remeda","err","err"]}