diff --git a/src/controllers/imposterController.js b/src/controllers/imposterController.js index 1f6d7b97a..502550c62 100644 --- a/src/controllers/imposterController.js +++ b/src/controllers/imposterController.js @@ -87,6 +87,19 @@ function create (protocols, imposters, logger, allowInjection) { }); } + /** + * The function responding to GET /imposters/:id/state + * Returns the state shared by the imposter's injection functions + * @memberOf module:controllers/imposterController# + * @param {Object} request - the HTTP request + * @param {Object} response - the HTTP response + * @returns {Object} A promise for testing + */ + async function getState (request, response) { + const imposter = await imposters.get(request.params.id); + response.send(imposter.getState()); + } + /** * The function responding to DELETE /imposters/:id * @memberOf module:controllers/imposterController# @@ -316,6 +329,7 @@ function create (protocols, imposters, logger, allowInjection) { del, resetProxies, resetRequests, + getState, postRequest, postProxyResponse, putStubs, diff --git a/src/models/imposter.js b/src/models/imposter.js index 9139ae1a1..442015c5b 100644 --- a/src/models/imposter.js +++ b/src/models/imposter.js @@ -219,8 +219,9 @@ async function create (Protocol, creationRequest, baseLogger, config, isAllowedC return recordRequests ? stubs.loadRequests() : []; } - const printer = imposterPrinter.create(header, server, loadRequests), - toJSON = options => printer.toJSON(numberOfRequests, options); + const printer = imposterPrinter.create(header, server, loadRequests, imposterState), + toJSON = options => printer.toJSON(numberOfRequests, options), + getState = () => printer.stateToJSON(); return resolve({ port: server.port, @@ -230,7 +231,8 @@ async function create (Protocol, creationRequest, baseLogger, config, isAllowedC stop, getResponseFor, getProxyResponseFor, - resetRequests + resetRequests, + getState }); }, reject); } diff --git a/src/models/imposterPrinter.js b/src/models/imposterPrinter.js index b8446fb4f..a086965b5 100644 --- a/src/models/imposterPrinter.js +++ b/src/models/imposterPrinter.js @@ -2,7 +2,7 @@ const helpers = require('../util/helpers.js'); -function create (header, server, loadRequests) { +function create (header, server, loadRequests, imposterState) { const baseURL = `/imposters/${server.port}`; function createHeader (numberOfRequests, options) { @@ -62,6 +62,16 @@ function create (header, server, loadRequests) { return imposter; } + function stateToJSON () { + try { + // Clone to prevent accidental state changes downstream + return helpers.clone(imposterState); + } + catch (error) { + return `Unable to serialize state: ${error.message}`; + } + } + function removeProxiesFrom (imposter) { imposter.stubs.forEach(stub => { // eslint-disable-next-line no-prototype-builtins @@ -117,7 +127,7 @@ function create (header, server, loadRequests) { return result; } - return { toJSON }; + return { toJSON, stateToJSON }; } module.exports = { create }; diff --git a/src/mountebank.js b/src/mountebank.js index bd8375c0c..034be1e9e 100644 --- a/src/mountebank.js +++ b/src/mountebank.js @@ -95,6 +95,7 @@ async function createApp (options) { app.delete('/imposters/:id', imposterController.del); app.delete('/imposters/:id/savedProxyResponses', validateImposterExists, imposterController.resetProxies); app.delete('/imposters/:id/savedRequests', validateImposterExists, imposterController.resetRequests); + app.get('/imposters/:id/state', validateImposterExists, imposterController.getState); // deprecated but saved for backwards compatibility app.delete('/imposters/:id/requests', validateImposterExists, imposterController.resetProxies);