@pact-foundation/pact
Version:
Pact for all things Javascript
157 lines • 6.54 kB
JavaScript
"use strict";
/**
* Provider Verifier service
* @module ProviderVerifier
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Verifier = void 0;
const node_url_1 = __importDefault(require("node:url"));
const pact_core_1 = __importDefault(require("@pact-foundation/pact-core"));
const lodash_1 = require("lodash");
const logger_1 = __importStar(require("../../common/logger"));
const net_1 = require("../../common/net");
const configurationError_1 = __importDefault(require("../../errors/configurationError"));
const proxy_1 = require("./proxy");
class Verifier {
address = 'http://127.0.0.1';
stateSetupPath = '/_pactSetup';
messageTransportPath = '/_messages';
config;
deprecatedFields = [
'providerStatesSetupUrl',
];
constructor(config) {
this.config = config;
if (this.config.logLevel && !(0, lodash_1.isEmpty)(this.config.logLevel)) {
pact_core_1.default.logLevel(this.config.logLevel);
(0, logger_1.setLogLevel)(this.config.logLevel);
}
this.deprecatedFields.forEach((f) => {
if (this.config[f]) {
logger_1.default.warn(`${f} is deprecated, and will be removed in future versions`);
}
});
if (this.config.validateSSL === undefined) {
this.config.validateSSL = true;
}
if (this.config.proxyHost) {
this.address = `http://${this.config.proxyHost}`;
}
if (this.config.changeOrigin === undefined) {
this.config.changeOrigin = false;
if (!this.isLocalVerification()) {
this.config.changeOrigin = true;
logger_1.default.debug(`non-local provider address ${this.config.providerBaseUrl} detected, setting 'changeOrigin' to 'true'. This property can be overridden.`);
}
}
if (!this.config.providerBaseUrl &&
!this.config.messageProviders &&
!this?.config?.transports) {
throw new configurationError_1.default("'providerBaseUrl' is mandatory if no 'messageProviders' or 'transports' given");
}
}
/**
* Verify a HTTP Provider
*
* @param config
*/
verifyProvider() {
logger_1.default.info('Verifying provider');
if ((0, lodash_1.isEmpty)(this.config)) {
return Promise.reject(new configurationError_1.default('No configuration provided to verifier'));
}
// Start the verification CLI proxy server. The hooks state is owned here so
// that any beforeEach/afterEach failures recorded during verification can be
// surfaced once it completes.
const hooksState = (0, proxy_1.createHooksState)();
const server = (0, proxy_1.createProxy)(this.config, this.stateSetupPath, this.messageTransportPath, hooksState);
logger_1.default.trace(`proxy created, waiting for startup`);
// Run the verification once the proxy server is available
return (0, proxy_1.waitForServerReady)(server)
.then((passOn) => {
logger_1.default.trace(`Proxy is ready at ${server.address().address}`);
return passOn;
})
.then(this.runProviderVerification())
.then((result) => {
logger_1.default.trace('Verification completed, closing server');
server.close();
if (hooksState.errors.length > 0) {
throw new Error(`Provider verification hooks failed:\n${hooksState.errors
.map((e) => ` - ${e.message}`)
.join('\n')}`);
}
return result;
})
.catch((e) => {
logger_1.default.trace(`Verification failed(${e.message}), closing server`);
server.close();
throw e;
});
}
// Run the Verification CLI process
runProviderVerification() {
return (server) => {
const { port } = server.address();
const opts = {
providerStatesSetupUrl: `${this.address}:${port}${this.stateSetupPath}`,
...(0, lodash_1.omit)(this.config, 'handlers'),
providerBaseUrl: `${this.address}:${port}`,
transports: (this.config.transports || []).concat([
{
port,
path: this.messageTransportPath,
protocol: 'message',
},
]),
};
logger_1.default.trace(`Verifying pacts with: ${JSON.stringify(opts)}`);
return pact_core_1.default.verifyPacts(opts);
};
}
isLocalVerification() {
if (!this.config.providerBaseUrl) {
return true;
}
const u = new node_url_1.default.URL(this.config.providerBaseUrl);
return (net_1.localAddresses.includes(u.host) || net_1.localAddresses.includes(u.hostname));
}
}
exports.Verifier = Verifier;
//# sourceMappingURL=verifier.js.map