UNPKG

@pact-foundation/pact

Version:
126 lines 5.56 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupMessageProxyApplication = exports.createProxyMessageHandler = exports.providerWithMetadata = exports.findMessageHandler = void 0; const body_parser_1 = __importDefault(require("body-parser")); const express_1 = __importDefault(require("express")); const js_base64_1 = require("js-base64"); const logger_1 = __importDefault(require("../../../common/logger")); // Find a provider message handler, and invoke it const findMessageHandler = (message, config) => { const handler = config.messageProviders ? config.messageProviders[message.description] : undefined; if (!handler) { logger_1.default.error(`no handler found for message ${message.description}`); return Promise.reject(new Error(`No handler found for message "${message.description}". Check your "handlers" configuration`)); } return Promise.resolve(handler); }; exports.findMessageHandler = findMessageHandler; const hasMetadata = (o) => Boolean(o.__pactMessageMetadata); const providerWithMetadata = (provider, metadata) => (descriptor) => Promise.resolve(provider(descriptor)).then((message) => hasMetadata(message) ? { __pactMessageMetadata: { ...message.__pactMessageMetadata, ...metadata, }, message, } : { __pactMessageMetadata: metadata, message }); exports.providerWithMetadata = providerWithMetadata; // Get the API handler for the verification CLI process to invoke on POST /* const createProxyMessageHandler = (config) => (req, res) => { // req.body = { // description: 'a MATT message', // providerStates: [ { name: 'a Matt message is sent' } ], // request: { // contents: { // content: 'aGVsbG90Y3A=', // contentType: 'application/matt', // encoded: 'base64' // }, // matchingRules: { // body: { // '$': { // combine: 'AND', // matchers: [ { match: 'contentType', value: 'application/matt' } ] // } // } // }, // metadata: { contentType: 'application/matt' } // } // } // { // description: 'a MATT message', // providerStates: [ { name: 'a Matt message is sent with JSON content' } ], // request: { // contents: { // content: { message: 'hellotcp' }, // contentType: 'application/json', // encoded: false // }, // metadata: { contentType: 'application/json' } // } // } const message = req.body; message.metadata = req.body.request?.metadata; // Add the request body, if one exists for synchronous messages if (req.body.request?.contents) { const encodedMessage = req.body.request?.contents?.encoded || false; if (encodedMessage) { message.content = Buffer.from(req.body.request?.contents?.content, 'base64'); } else { message.content = req.body.request?.contents?.content; } } // Invoke the handler, and return the JSON response body // wrapped in a Message (0, exports.findMessageHandler)(message, config) .then((handler) => handler(message)) .then((messageFromHandler) => { if (hasMetadata(messageFromHandler)) { const metadata = (0, js_base64_1.encode)(JSON.stringify(messageFromHandler.__pactMessageMetadata)); res.header('Pact-Message-Metadata', metadata); res.header('PACT_MESSAGE_METADATA', metadata); // Ensure return content-type is set here // TODO: this needs thinking through if (messageFromHandler.__pactMessageMetadata['content-type'] || messageFromHandler.__pactMessageMetadata['Content-Type'] || messageFromHandler.__pactMessageMetadata.contentType) { res.type(messageFromHandler.__pactMessageMetadata['content-type'] || messageFromHandler.__pactMessageMetadata['Content-Type'] || messageFromHandler.__pactMessageMetadata.contentType); return res.send(messageFromHandler.message); } return res.json(messageFromHandler.message); } return res.json(messageFromHandler); }) .catch((e) => res.status(500).send(e)); }; exports.createProxyMessageHandler = createProxyMessageHandler; // Get the Express app that will run on the HTTP Proxy const setupMessageProxyApplication = (config) => { const app = (0, express_1.default)(); app.use(body_parser_1.default.json()); app.use(body_parser_1.default.urlencoded({ extended: true })); app.use((_, res, next) => { // TODO: this seems to override the metadata for content-type res.header('Content-Type', 'application/json; charset=utf-8'); next(); }); // Proxy server will respond to Verifier process app.all('/{*splat}', (0, exports.createProxyMessageHandler)(config)); return app; }; exports.setupMessageProxyApplication = setupMessageProxyApplication; // // Get the Proxy we'll pass to the CLI for verification // export const setupProxyServer = ( // app: (request: http.IncomingMessage, response: http.ServerResponse) => void // ): http.Server => http.createServer(app).listen(); //# sourceMappingURL=messages.js.map