Socket
Socket
Sign inDemoInstall

mockttp

Package Overview
Dependencies
Maintainers
1
Versions
124
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mockttp - npm Package Compare versions

Comparing version 0.9.0 to 0.9.1

dist/server/request-utils.d.ts

4

dist/client/mockttp-client.d.ts

@@ -5,3 +5,3 @@ /**

import TypedError = require('typed-error');
import { MockedEndpoint, CompletedRequest } from "../types";
import { MockedEndpoint } from "../types";
import { MockRuleData } from "../rules/mock-rule-types";

@@ -46,4 +46,4 @@ import { Mockttp, AbstractMockttp, MockttpOptions } from "../mockttp";

addRule: (rule: MockRuleData) => Promise<MockedEndpoint>;
on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
on(event: 'request' | 'response', callback: Function): Promise<void>;
private getEndpointData;
}

@@ -332,19 +332,29 @@ "use strict";

var _this = this;
if (event !== 'request')
if (!_.includes(['request', 'response'], event))
return Promise.resolve();
var url = "ws://localhost:" + types_1.DEFAULT_STANDALONE_PORT + "/server/" + this.mockServerConfig.port + "/subscription";
var client = new subscriptions_transport_ws_1.SubscriptionClient(url, {}, WebSocket);
client.request({
var queryResultName = event === 'request' ? 'requestReceived' : 'responseCompleted';
var query = event === 'request' ? {
operationName: 'OnRequest',
query: "subscription OnRequest {\n requestReceived {\n protocol,\n method,\n url,\n path,\n hostname,\n\n headers,\n body {\n buffer,\n text,\n json,\n formData\n }\n }\n }"
}).subscribe({
query: "subscription OnRequest {\n " + queryResultName + " {\n id,\n protocol,\n method,\n url,\n path,\n hostname,\n\n headers,\n body {\n buffer,\n text,\n json,\n formData\n }\n }\n }"
} : {
operationName: 'OnResponse',
query: "subscription OnResponse {\n " + queryResultName + " {\n id,\n statusCode,\n statusMessage,\n headers,\n body {\n buffer,\n text,\n json,\n formData\n }\n }\n }"
};
client.request(query).subscribe({
next: function (value) {
if (value.data) {
var request = value.data.requestReceived;
// TODO: Get a proper graphql client that does this automatically from the schema itself
request.headers = JSON.parse(request.headers);
callback(request);
var data = value.data[queryResultName];
if (data.headers) {
// TODO: Get a proper graphql client that does this automatically from the schema itself
data.headers = JSON.parse(data.headers);
}
callback(data);
}
else if (value.errors) {
console.error('Error in subscription', value.errors);
}
},
error: function (e) { return _this.debug && console.warn('Error in request subscription:', e); }
error: function (e) { return _this.debug && console.warn('Error in remote subscription:', e); }
});

@@ -351,0 +361,0 @@ return new Promise(function (resolve, reject) {

import { Mockttp, MockttpOptions } from "./mockttp";
export { OngoingRequest, CompletedRequest } from "./types";
export { OngoingRequest, CompletedRequest, CompletedResponse } from "./types";
export interface MockedEndpoint {

@@ -4,0 +4,0 @@ getSeenRequests(): Request[];

import { MockttpStandalone, StandaloneServerOptions } from "./standalone/mockttp-standalone";
import { Mockttp, MockttpOptions } from "./mockttp";
export { OngoingRequest, CompletedRequest } from "./types";
export interface MockedEndpoint {
getSeenRequests(): Request[];
}
export { OngoingRequest, CompletedRequest, CompletedResponse, MockedEndpoint } from "./types";
export { Mockttp };

@@ -8,0 +5,0 @@ /**

import MockRuleBuilder from "./rules/mock-rule-builder";
import { ProxyConfig, MockedEndpoint, CompletedRequest } from "./types";
import { ProxyConfig, MockedEndpoint, CompletedRequest, CompletedResponse } from "./types";
import { MockRuleData } from "./rules/mock-rule-types";

@@ -130,2 +130,13 @@ import { CAOptions } from './util/tls';

on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
/**
* Subscribe to hear about response details as the response is completed.
*
* This is only useful in some niche use cases, such as logging all requests seen
* by the server independently of the rules defined.
*
* The callback will be called asynchronously from request handling. This function
* returns a promise, and the callback is not guaranteed to be registered until
* the promise is resolved.
*/
on(event: 'response', callback: (req: CompletedResponse) => void): Promise<void>;
}

@@ -132,0 +143,0 @@ export interface MockttpOptions {

@@ -7,3 +7,3 @@ /// <reference types="node" />

import { Serializable, SerializationOptions } from "../util/serialization";
import { CompletedRequest, OngoingRequest } from "../types";
import { CompletedRequest, OngoingRequest, OngoingResponse } from "../types";
import { RequestHandler } from "./mock-rule-types";

@@ -20,3 +20,3 @@ export declare type SerializedBuffer = {

constructor(status: number, data?: string | Buffer | SerializedBuffer | undefined, headers?: http.OutgoingHttpHeaders | undefined);
buildHandler(): ((request: OngoingRequest, response: express.Response) => Promise<void>) & {
buildHandler(): ((request: OngoingRequest, response: OngoingResponse) => Promise<void>) & {
explain: () => string;

@@ -23,0 +23,0 @@ };

@@ -72,3 +72,3 @@ "use strict";

var common_tags_1 = require("common-tags");
var request_utils_1 = require("../util/request-utils");
var request_utils_1 = require("../server/request-utils");
var serialization_1 = require("../util/serialization");

@@ -75,0 +75,0 @@ function isSerializedBuffer(obj) {

/**
* @module MockRule
*/
import { Explainable, OngoingRequest, CompletedRequest, Response } from "../types";
import { Explainable, OngoingRequest, CompletedRequest, OngoingResponse } from "../types";
import { MatcherData } from "./matchers";

@@ -27,3 +27,3 @@ import { CompletionCheckerData } from "./completion-checkers";

export interface RequestHandler extends RuleExplainable {
(request: OngoingRequest, response: Response): Promise<void>;
(request: OngoingRequest, response: OngoingResponse): Promise<void>;
}

@@ -30,0 +30,0 @@ export interface RuleCompletionChecker extends RuleExplainable {

@@ -41,5 +41,6 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
var _ = require("lodash");
var uuid = require("uuid/v4");
var serialization_1 = require("../util/serialization");
var request_utils_1 = require("../util/request-utils");
var request_utils_1 = require("../server/request-utils");
var matching = require("./matchers");

@@ -79,3 +80,3 @@ var handling = require("./handlers");

var thisRule = this;
var recordRequest = function recordRequest(req, res) {
var recordRequest = _.assign(function recordRequest(req) {
var _this = this;

@@ -99,4 +100,5 @@ var handlerArgs = arguments;

return completedAndRecordedPromise.then(function () { });
};
recordRequest.explain = handler.explain;
}, {
explain: handler.explain
});
return recordRequest;

@@ -103,0 +105,0 @@ };

@@ -1,2 +0,2 @@

import { CompletedRequest } from "../types";
import { CompletedRequest, CompletedResponse } from "../types";
import { MockRuleData } from "../rules/mock-rule-types";

@@ -27,4 +27,6 @@ import { Mockttp, AbstractMockttp, MockttpOptions } from "../mockttp";

on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
on(event: 'response', callback: (req: CompletedResponse) => void): Promise<void>;
private announceRequestAsync(request);
private handleRequest(request, response);
private announceResponseAsync(response);
private handleRequest(request, rawResponse);
private isComplete;

@@ -31,0 +33,0 @@ private explainRequest(request);

@@ -57,2 +57,3 @@ "use strict";

var express = require("express");
var uuid = require("uuid/v4");
var cors = require("cors");

@@ -64,6 +65,5 @@ var _ = require("lodash");

var mock_rule_1 = require("../rules/mock-rule");
var promise_1 = require("../util/promise");
var mocked_endpoint_1 = require("./mocked-endpoint");
var parse_body_1 = require("./parse-body");
var promise_1 = require("../util/promise");
var request_utils_1 = require("../util/request-utils");
var request_utils_1 = require("./request-utils");
/**

@@ -107,3 +107,3 @@ * A in-process Mockttp implementation. This starts servers on the local machine in the

}
_this.app.use(parse_body_1.parseBody);
_this.app.use(request_utils_1.parseBody);
_this.app.use(_this.handleRequest.bind(_this));

@@ -301,6 +301,16 @@ return _this;

};
MockttpServer.prototype.handleRequest = function (request, response) {
MockttpServer.prototype.announceResponseAsync = function (response) {
var _this = this;
setImmediate(function () {
request_utils_1.waitForCompletedResponse(response)
.then(function (res) {
_this.eventEmitter.emit('response', res);
})
.catch(console.error);
});
};
MockttpServer.prototype.handleRequest = function (request, rawResponse) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
var matchingRules_1, nextRule, requestExplanation, _a, _b, e_1;
var response, id, matchingRules_1, nextRule, requestExplanation, _a, _b, e_1;
return __generator(this, function (_c) {

@@ -311,2 +321,6 @@ switch (_c.label) {

console.log("Handling request for " + request.url);
response = request_utils_1.trackResponse(rawResponse);
id = uuid();
request.id = id;
response.id = id;
this.announceRequestAsync(request);

@@ -369,3 +383,5 @@ _c.label = 1;

return [3 /*break*/, 9];
case 9: return [2 /*return*/];
case 9:
this.announceResponseAsync(response);
return [2 /*return*/];
}

@@ -372,0 +388,0 @@ });

@@ -54,2 +54,3 @@ "use strict";

var REQUEST_RECEIVED_TOPIC = 'request-received';
var RESPONSE_COMPLETED_TOPIC = 'response-completed';
function astToObject(ast) {

@@ -161,2 +162,7 @@ return _.zipObject(ast.fields.map(function (f) { return f.name.value; }), ast.fields.map(function (f) { return parseAnyAst(f.value); }));

});
mockServer.on('response', function (response) {
pubsub.publish(RESPONSE_COMPLETED_TOPIC, {
responseCompleted: response
});
});
return __assign({ Query: {

@@ -191,2 +197,5 @@ mockedEndpoints: function () {

subscribe: function () { return pubsub.asyncIterator(REQUEST_RECEIVED_TOPIC); }
},
responseCompleted: {
subscribe: function () { return pubsub.asyncIterator(RESPONSE_COMPLETED_TOPIC); }
}

@@ -193,0 +202,0 @@ } }, ScalarResolvers);

@@ -28,24 +28,42 @@ /// <reference types="node" />

export interface OngoingRequest extends Request {
id: string;
originalUrl: string;
body: {
rawStream: stream.Readable;
asBuffer: () => Promise<Buffer>;
asText: () => Promise<string>;
asJson: () => Promise<object>;
asFormData: () => Promise<{
[key: string]: string;
}>;
};
body: ParsedBody;
}
export interface ParsedBody {
rawStream: stream.Readable;
asBuffer: () => Promise<Buffer>;
asText: () => Promise<string>;
asJson: () => Promise<object>;
asFormData: () => Promise<{
[key: string]: string;
}>;
}
export interface CompletedBody {
buffer: Buffer;
text: string | undefined;
json: object | undefined;
formData: {
[key: string]: string;
} | undefined;
}
export interface CompletedRequest extends Request {
body: {
buffer: Buffer;
text: string | undefined;
json: object | undefined;
formData: {
[key: string]: string;
} | undefined;
id: string;
body: CompletedBody;
}
export interface OngoingResponse extends express.Response {
id: string;
getHeaders(): {
[key: string]: string;
};
body: ParsedBody;
}
export interface Response extends express.Response {
export interface CompletedResponse {
id: string;
statusCode: number;
statusMessage: string;
headers: {
[key: string]: string;
};
body: CompletedBody;
}

@@ -52,0 +70,0 @@ /**

{
"name": "mockttp",
"version": "0.9.0",
"version": "0.9.1",
"description": "Mock HTTP server for testing HTTP clients and stubbing webservices",

@@ -125,3 +125,3 @@ "main": "dist/main.js",

"typed-error": "^2.0.0",
"universal-websocket-client": "^1.0.1",
"universal-websocket-client": "^1.0.2",
"uuid": "^3.1.0",

@@ -128,0 +128,0 @@ "websocket-stream": "^5.1.2"

@@ -66,6 +66,6 @@ # Mockttp [![Travis Build Status](https://img.shields.io/travis/pimterry/mockttp.svg)](https://travis-ci.org/pimterry/mockttp) [![Try Mockttp on RunKit](https://badge.runkitcdn.com/mockttp.svg)](https://npm.runkit.com/mockttp)

return superagent.get("http://localhost:8080/mocked-path");
}).then(() => {
}).then(response => {
// Assert on the results
expect(response.text).to.equal("A mocked response");
});
})
);

@@ -72,0 +72,0 @@ });

@@ -19,8 +19,6 @@ /**

import { ProxyConfig, Method, MockedEndpoint, OngoingRequest, CompletedRequest } from "../types";
import { MockedEndpoint } from "../types";
import {
MockRule,
MockRuleData
} from "../rules/mock-rule-types";
import MockRuleBuilder from "../rules/mock-rule-builder";
import { Mockttp, AbstractMockttp, MockttpOptions } from "../mockttp";

@@ -56,14 +54,5 @@ import { MockServerConfig } from "../standalone/mockttp-standalone";

/** @hidden */
interface RequestData { }
/** @hidden */
interface MockedEndpointState {
id: string;
seenRequests: RequestData[]
}
/**
* A Mockttp implementation, controlling a remote Mockttp standalone server.
*
*
* This starts servers by making requests to the remote standalone server, and exposes

@@ -242,4 +231,4 @@ * methods to directly manage them.

public on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void> {
if (event !== 'request') return Promise.resolve();
public on(event: 'request' | 'response', callback: Function): Promise<void> {
if (!_.includes(['request', 'response'], event)) return Promise.resolve();

@@ -249,6 +238,9 @@ const url = `ws://localhost:${DEFAULT_STANDALONE_PORT}/server/${this.mockServerConfig!.port}/subscription`;

client.request({
const queryResultName = event === 'request' ? 'requestReceived' : 'responseCompleted';
const query = event === 'request' ? {
operationName: 'OnRequest',
query: `subscription OnRequest {
requestReceived {
${queryResultName} {
id,
protocol,

@@ -269,12 +261,34 @@ method,

}`
}).subscribe({
} : {
operationName: 'OnResponse',
query: `subscription OnResponse {
${queryResultName} {
id,
statusCode,
statusMessage,
headers,
body {
buffer,
text,
json,
formData
}
}
}`
}
client.request(query).subscribe({
next: (value) => {
if (value.data) {
const request = (<any> value.data).requestReceived;
// TODO: Get a proper graphql client that does this automatically from the schema itself
request.headers = JSON.parse(request.headers);
callback(request);
const data = (<any> value.data)[queryResultName];
if (data.headers) {
// TODO: Get a proper graphql client that does this automatically from the schema itself
data.headers = JSON.parse(data.headers);
}
callback(data);
} else if (value.errors) {
console.error('Error in subscription', value.errors);
}
},
error: (e) => this.debug && console.warn('Error in request subscription:', e)
error: (e) => this.debug && console.warn('Error in remote subscription:', e)
});

@@ -281,0 +295,0 @@

import MockttpClient from "./client/mockttp-client";
import { Mockttp, MockttpOptions } from "./mockttp";
export { OngoingRequest, CompletedRequest } from "./types";
export { OngoingRequest, CompletedRequest, CompletedResponse } from "./types";

@@ -6,0 +6,0 @@ export interface MockedEndpoint {

@@ -10,8 +10,4 @@ /**

import { Mockttp, MockttpOptions } from "./mockttp";
export { OngoingRequest, CompletedRequest } from "./types";
export { OngoingRequest, CompletedRequest, CompletedResponse, MockedEndpoint } from "./types";
export interface MockedEndpoint {
getSeenRequests(): Request[]
}
export { Mockttp };

@@ -58,2 +54,2 @@

return new MockttpStandalone(options);
}
}

@@ -7,3 +7,3 @@ /**

import MockRuleBuilder from "./rules/mock-rule-builder";
import { ProxyConfig, MockedEndpoint, Method, OngoingRequest, CompletedRequest } from "./types";
import { ProxyConfig, MockedEndpoint, Method, CompletedRequest, CompletedResponse } from "./types";
import { MockRuleData } from "./rules/mock-rule-types";

@@ -144,2 +144,14 @@ import { CAOptions } from './util/tls';

on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
/**
* Subscribe to hear about response details as the response is completed.
*
* This is only useful in some niche use cases, such as logging all requests seen
* by the server independently of the rules defined.
*
* The callback will be called asynchronously from request handling. This function
* returns a promise, and the callback is not guaranteed to be registered until
* the promise is resolved.
*/
on(event: 'response', callback: (req: CompletedResponse) => void): Promise<void>;
}

@@ -146,0 +158,0 @@

@@ -14,11 +14,9 @@ /**

import { encode as encodeBase64, decode as decodeBase64 } from 'base64-arraybuffer';
import { Readable, PassThrough, Transform } from 'stream';
import { Readable, Transform } from 'stream';
import { stripIndent } from 'common-tags';
import { IncomingMessage } from 'http';
import { waitForCompletedRequest } from '../util/request-utils';
import { waitForCompletedRequest } from '../server/request-utils';
import { Serializable, SerializationOptions } from "../util/serialization";
import { CompletedRequest, OngoingRequest } from "../types";
import { CompletedRequest, OngoingRequest, OngoingResponse } from "../types";
import { RequestHandler } from "./mock-rule-types";

@@ -44,3 +42,3 @@

buildHandler() {
return _.assign(async (request: OngoingRequest, response: express.Response) => {
return _.assign(async (request: OngoingRequest, response: OngoingResponse) => {
response.writeHead(this.status, this.headers);

@@ -47,0 +45,0 @@

@@ -5,3 +5,3 @@ /**

import { Explainable, OngoingRequest, CompletedRequest, Response, Method } from "../types";
import { Explainable, OngoingRequest, CompletedRequest, OngoingResponse } from "../types";
import { MatcherData } from "./matchers";

@@ -36,3 +36,3 @@ import { CompletionCheckerData } from "./completion-checkers";

export interface RequestHandler extends RuleExplainable {
(request: OngoingRequest, response: Response): Promise<void>
(request: OngoingRequest, response: OngoingResponse): Promise<void>
}

@@ -39,0 +39,0 @@

@@ -5,11 +5,11 @@ /**

import * as _ from 'lodash';
import uuid = require("uuid/v4");
import { deserialize, SerializationOptions } from '../util/serialization';
import { waitForCompletedRequest } from '../util/request-utils';
import { waitForCompletedRequest } from '../server/request-utils';
import { OngoingRequest, CompletedRequest, Response } from "../types";
import { OngoingRequest, CompletedRequest } from "../types";
import {
MockRule as MockRuleInterface,
RuleExplainable,
RuleCompletionChecker,

@@ -69,20 +69,23 @@ RequestHandler,

const recordRequest = <RequestHandler> function recordRequest(this: any, req: OngoingRequest, res: Response) {
const handlerArgs = arguments;
let completedAndRecordedPromise = (async (resolve, reject) => {
// Start recording before the data starts piping, so we don't miss anything.
let buffer = req.body.asBuffer();
const recordRequest = <RequestHandler> _.assign(
function recordRequest(this: any, req: OngoingRequest) {
const handlerArgs = arguments;
let completedAndRecordedPromise = (async (resolve, reject) => {
// Start recording before the data starts piping, so we don't miss anything.
let buffer = req.body.asBuffer();
await handler.apply(this, handlerArgs);
await handler.apply(this, handlerArgs);
return waitForCompletedRequest(req);
})();
// Requests are added to rule.requests as soon as they start being handled.
thisRule.requests.push(completedAndRecordedPromise);
return waitForCompletedRequest(req);
})();
return completedAndRecordedPromise.then(() => {});
};
// Requests are added to rule.requests as soon as they start being handled.
thisRule.requests.push(completedAndRecordedPromise);
recordRequest.explain = handler.explain;
return completedAndRecordedPromise.then(() => {});
}, {
explain: handler.explain
}
);
return recordRequest;

@@ -89,0 +92,0 @@ }

@@ -12,2 +12,3 @@ /**

import express = require("express");
import uuid = require('uuid/v4');

@@ -17,5 +18,4 @@ import cors = require("cors");

import { Method, OngoingRequest, CompletedRequest, ProxyConfig } from "../types";
import { OngoingRequest, CompletedRequest, CompletedResponse, OngoingResponse } from "../types";
import { MockRuleData } from "../rules/mock-rule-types";
import MockRuleBuilder from "../rules/mock-rule-builder";
import { CAOptions, getCA } from '../util/tls';

@@ -25,8 +25,13 @@ import destroyable, { DestroyableServer } from "../util/destroyable-server";

import { MockRule } from "../rules/mock-rule";
import { MockedEndpoint } from "./mocked-endpoint";
import { parseBody } from "./parse-body";
import { filter } from "../util/promise";
import { waitForCompletedRequest } from "../util/request-utils";
import { MockedEndpoint } from "./mocked-endpoint";
import {
parseBody,
waitForCompletedRequest,
trackResponse,
waitForCompletedResponse,
} from "./request-utils";
/**

@@ -92,3 +97,3 @@ * A in-process Mockttp implementation. This starts servers on the local machine in the

if (this.debug) console.log(`Generating server certificate for ${domain}`);
const generatedCert = ca.generateCertificate(domain);

@@ -120,3 +125,3 @@ cb(null, tls.createSecureContext({

}
// We can't recover from this - just try to close the underlying socket.

@@ -173,3 +178,3 @@ try { socket.destroy(); } catch (e) {}

if (this.server) await this.server.destroy();
this.reset();

@@ -213,3 +218,5 @@ }

public on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void> {
public on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
public on(event: 'response', callback: (req: CompletedResponse) => void): Promise<void>;
public on(event: string, callback: Function): Promise<void> {
this.eventEmitter.on(event, callback);

@@ -229,5 +236,22 @@ return Promise.resolve();

private async handleRequest(request: OngoingRequest, response: express.Response) {
private announceResponseAsync(response: OngoingResponse) {
setImmediate(() => {
waitForCompletedResponse(response)
.then((res: CompletedResponse) => {
this.eventEmitter.emit('response', res);
})
.catch(console.error);
});
}
private async handleRequest(request: OngoingRequest, rawResponse: express.Response) {
if (this.debug) console.log(`Handling request for ${request.url}`);
const response = trackResponse(rawResponse);
const id = uuid();
request.id = id;
response.id = id;
this.announceRequestAsync(request);

@@ -267,3 +291,3 @@

}
// Make sure any errors here don't kill the process

@@ -276,2 +300,4 @@ response.on('error', (e) => {});

}
this.announceResponseAsync(response);
}

@@ -291,10 +317,10 @@

let msg = `${request.method} request to ${request.url}`;
let bodyText = await request.body.asText();
if (bodyText) msg += ` with body \`${bodyText}\``;
if (!_.isEmpty(request.headers)) {
msg += ` with headers:\n${JSON.stringify(request.headers, null, 2)}`;
}
return msg;

@@ -305,16 +331,16 @@ }

let msg = "You can fix this by adding a rule to match this request, for example:\n"
msg += `mockServer.${request.method.toLowerCase()}("${request.path}")`;
let isFormRequest = !!request.headers["content-type"] && request.headers["content-type"].indexOf("application/x-www-form-urlencoded") > -1;
let formBody = await request.body.asFormData().catch(() => undefined);
if (isFormRequest && !!formBody) {
msg += `.withForm(${JSON.stringify(formBody)})`;
}
msg += '.thenReply(200, "your response");';
return msg;
}
}

@@ -27,2 +27,3 @@ /**

const REQUEST_RECEIVED_TOPIC = 'request-received';
const RESPONSE_COMPLETED_TOPIC = 'response-completed';

@@ -104,3 +105,3 @@ function astToObject<T>(ast: ObjectValueNode): T {

}),
Json: new GraphQLScalarType({

@@ -132,2 +133,8 @@ name: 'Json',

mockServer.on('response', (response) => {
pubsub.publish(RESPONSE_COMPLETED_TOPIC, {
responseCompleted: response
})
});
return <any> {

@@ -164,2 +171,5 @@ Query: {

subscribe: () => pubsub.asyncIterator(REQUEST_RECEIVED_TOPIC)
},
responseCompleted: {
subscribe: () => pubsub.asyncIterator(RESPONSE_COMPLETED_TOPIC)
}

@@ -166,0 +176,0 @@ },

@@ -31,25 +31,43 @@ /**

export interface OngoingRequest extends Request {
id: string;
originalUrl: string;
body: {
rawStream: stream.Readable,
asBuffer: () => Promise<Buffer>,
asText: () => Promise<string>,
asJson: () => Promise<object>,
asFormData: () => Promise<{ [key: string]: string }>
}
body: ParsedBody;
}
export interface ParsedBody {
rawStream: stream.Readable;
asBuffer: () => Promise<Buffer>;
asText: () => Promise<string>;
asJson: () => Promise<object>;
asFormData: () => Promise<{ [key: string]: string }>;
}
export interface CompletedBody {
buffer: Buffer;
text: string | undefined;
json: object | undefined;
formData: { [key: string]: string } | undefined;
}
export interface CompletedRequest extends Request {
body: {
buffer: Buffer,
text: string | undefined,
json: object | undefined,
formData: { [key: string]: string } | undefined
}
id: string;
body: CompletedBody;
}
export interface Response extends express.Response { }
export interface OngoingResponse extends express.Response {
id: string;
getHeaders(): { [key: string]: string };
body: ParsedBody;
}
export interface CompletedResponse {
id: string;
statusCode: number;
statusMessage: string;
headers: { [key: string]: string; };
body: CompletedBody;
}
/**

@@ -56,0 +74,0 @@ * A mocked endpoint provides methods to see the current state of

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc