@dgac/nmb2b-client
Version:
EUROCONTROL Network Manager B2B SOAP client
1 lines • 10.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/config.ts","../src/security.ts","../src/utils/debug.ts","../src/constants.ts"],"sourcesContent":["import type { Security } from './security';\nimport { isValidSecurity } from './security';\nimport type { B2BFlavour } from './constants';\nimport { B2B_VERSION, B2BFlavours } from './constants';\nimport invariant from 'invariant';\nimport { URL } from 'url';\nimport type { Client as SoapClient } from 'soap';\n\nexport interface Config {\n endpoint?: string;\n xsdEndpoint?: string;\n ignoreWSDLCache?: boolean;\n security: Security;\n flavour: B2BFlavour;\n XSD_PATH: string;\n soapClient?: null | SoapClient;\n}\n\nexport function isConfigValid(args: unknown): args is Config {\n invariant(!!args && typeof args === 'object', 'Invalid config');\n\n invariant(\n 'security' in args && isValidSecurity(args.security),\n 'Please provide a valid security option',\n );\n\n invariant(\n 'flavour' in args && typeof args.flavour === 'string',\n `Invalid config.flavour. Supported flavours: ${B2BFlavours.join(', ')}`,\n );\n\n invariant(\n B2BFlavours.includes(args.flavour),\n `Invalid config.flavour. Supported flavours: ${B2BFlavours.join(', ')}`,\n );\n\n if ('apiKeyId' in args.security) {\n invariant(\n 'endpoint' in args && !!args.endpoint,\n `When using an config.security.apiKeyId, config.endpoint must be defined`,\n );\n\n invariant(\n 'xsdEndpoint' in args && !!args.xsdEndpoint,\n `When using an config.security.apiKeyId, config.xsdEndpoint must be defined`,\n );\n }\n\n return true;\n}\n\nconst B2B_ROOTS = {\n OPS: 'https://www.b2b.nm.eurocontrol.int',\n PREOPS: 'https://www.b2b.preops.nm.eurocontrol.int',\n};\n\nexport function getEndpoint(\n config: { endpoint?: string; flavour?: B2BFlavour } = {},\n): string {\n const { endpoint, flavour } = config;\n\n if (flavour && flavour === 'PREOPS') {\n return `${\n endpoint ?? B2B_ROOTS.PREOPS\n }/B2B_PREOPS/gateway/spec/${B2B_VERSION}`;\n }\n\n return `${endpoint ?? B2B_ROOTS.OPS}/B2B_OPS/gateway/spec/${B2B_VERSION}`;\n}\n\nexport function getFileEndpoint(\n config: { endpoint?: string; flavour?: B2BFlavour } = {},\n): string {\n const { endpoint, flavour } = config;\n\n if (flavour && flavour === 'PREOPS') {\n return `${endpoint ?? B2B_ROOTS.PREOPS}/FILE_PREOPS/gateway/spec`;\n }\n\n return `${endpoint ?? B2B_ROOTS.OPS}/FILE_OPS/gateway/spec`;\n}\n\nexport function getFileUrl(\n path: string,\n config: { flavour?: B2BFlavour; endpoint?: string } = {},\n): string {\n if (config.endpoint) {\n return new URL(\n (path[0] && path.startsWith('/') ? '' : '/') + path,\n config.endpoint,\n ).toString();\n }\n\n return (\n getFileEndpoint(config) +\n (path[0] && path.startsWith('/') ? '' : '/') +\n path\n );\n}\n\nexport function obfuscate(config: Config) {\n return {\n ...config,\n security: Object.keys(config.security).reduce((prev, curr) => {\n return {\n ...prev,\n [curr]: 'xxxxxxxxxxxxxxxx',\n };\n }, {}),\n };\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 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAAsB;;;ACAtB,mBAAc;AACd,IAAM,SAAS;AACf,IAAM,YAAQ,aAAAA,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;AA4BnB,SAAS,gBAAgB,KAA+B;AAC7D,uBAAAC,SAAU,CAAC,CAAC,OAAO,OAAO,QAAQ,UAAU,mBAAmB;AAE/D,MAAI,cAAc,KAAK;AACrB,yBAAAA;AAAA,MACE,CAAC,CAAC,IAAI,YACJ,OAAO,IAAI,aAAa,YACxB,IAAI,SAAS,SAAS;AAAA,MACxB;AAAA,IACF;AAEA,yBAAAA;AAAA,MACE,kBAAkB,OAChB,OAAO,IAAI,iBAAiB,YAC5B,IAAI,aAAa,SAAS;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,uBAAAA;AAAA,IACG,SAAS,OAAO,OAAO,SAAS,IAAI,GAAG,KACrC,UAAU,OAAO,OAAO,SAAS,IAAI,IAAI;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,UAAU,OAAO,IAAI,MAAM;AAC7B,yBAAAA;AAAA,MACE,SAAS,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AEjEA,kBAAiB;AAGV,IAAM,cAAc;AACpB,IAAM,cAAc,CAAC,OAAO,QAAQ;;;AHA3C,IAAAC,oBAAsB;AACtB,iBAAoB;AAab,SAAS,cAAc,MAA+B;AAC3D,wBAAAC,SAAU,CAAC,CAAC,QAAQ,OAAO,SAAS,UAAU,gBAAgB;AAE9D,wBAAAA;AAAA,IACE,cAAc,QAAQ,gBAAgB,KAAK,QAAQ;AAAA,IACnD;AAAA,EACF;AAEA,wBAAAA;AAAA,IACE,aAAa,QAAQ,OAAO,KAAK,YAAY;AAAA,IAC7C,+CAA+C,YAAY,KAAK,IAAI,CAAC;AAAA,EACvE;AAEA,wBAAAA;AAAA,IACE,YAAY,SAAS,KAAK,OAAO;AAAA,IACjC,+CAA+C,YAAY,KAAK,IAAI,CAAC;AAAA,EACvE;AAEA,MAAI,cAAc,KAAK,UAAU;AAC/B,0BAAAA;AAAA,MACE,cAAc,QAAQ,CAAC,CAAC,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,0BAAAA;AAAA,MACE,iBAAiB,QAAQ,CAAC,CAAC,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,YAAY;AAAA,EAChB,KAAK;AAAA,EACL,QAAQ;AACV;AAEO,SAAS,YACd,SAAsD,CAAC,GAC/C;AACR,QAAM,EAAE,UAAU,QAAQ,IAAI;AAE9B,MAAI,WAAW,YAAY,UAAU;AACnC,WAAO,GACL,YAAY,UAAU,MACxB,4BAA4B,WAAW;AAAA,EACzC;AAEA,SAAO,GAAG,YAAY,UAAU,GAAG,yBAAyB,WAAW;AACzE;AAEO,SAAS,gBACd,SAAsD,CAAC,GAC/C;AACR,QAAM,EAAE,UAAU,QAAQ,IAAI;AAE9B,MAAI,WAAW,YAAY,UAAU;AACnC,WAAO,GAAG,YAAY,UAAU,MAAM;AAAA,EACxC;AAEA,SAAO,GAAG,YAAY,UAAU,GAAG;AACrC;AAEO,SAAS,WACdC,OACA,SAAsD,CAAC,GAC/C;AACR,MAAI,OAAO,UAAU;AACnB,WAAO,IAAI;AAAA,OACRA,MAAK,CAAC,KAAKA,MAAK,WAAW,GAAG,IAAI,KAAK,OAAOA;AAAA,MAC/C,OAAO;AAAA,IACT,EAAE,SAAS;AAAA,EACb;AAEA,SACE,gBAAgB,MAAM,KACrBA,MAAK,CAAC,KAAKA,MAAK,WAAW,GAAG,IAAI,KAAK,OACxCA;AAEJ;AAEO,SAAS,UAAU,QAAgB;AACxC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,OAAO,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAM,SAAS;AAC5D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,IAAI,GAAG;AAAA,MACV;AAAA,IACF,GAAG,CAAC,CAAC;AAAA,EACP;AACF;","names":["d","debug","invariant","import_invariant","invariant","path"]}