@pact-foundation/pact
Version:
Pact for all things Javascript
126 lines • 5.56 kB
JavaScript
;
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