mockttp
Version:
Mock HTTP server for testing HTTP clients and stubbing webservices
100 lines • 4.22 kB
TypeScript
import type * as streams from 'stream';
import type * as net from 'net';
import type * as tls from 'tls';
import { TlsSocketMetadata } from '../types';
export declare const InitialRemoteAddress: unique symbol;
export declare const InitialRemotePort: unique symbol;
export declare const TlsSetupCompleted: unique symbol;
export declare const LastHopEncrypted: unique symbol;
export declare const LastTunnelAddress: unique symbol;
export declare const TlsMetadata: unique symbol;
export declare const ClientErrorInProgress: unique symbol;
export declare const SocketTimingInfo: unique symbol;
export declare const SocketMetadata: unique symbol;
export interface SocketMetadata {
tags?: string[];
[key: string]: any;
}
declare module 'net' {
interface Socket {
/**
* Is this socket trying to send encrypted data upstream? For direct connections
* this always matches socket.encrypted. For CONNECT-proxied connections (where
* the initial connection could be HTTPS and the upstream connection HTTP, or
* vice versa) all on one socket, this is the value for the final hop.
*/
[LastHopEncrypted]?: boolean;
/**
* The hostname + maybe port from the inner-most tunnel request powering this
* socket. This is the best signal for the client's real target address,
* if provided. It's not set at all for direct (non-tunnelled) connections.
*/
[LastTunnelAddress]?: string;
/**
* If there's a client error being sent, we track the corresponding packet
* data on the socket, so that when it fires repeatedly we can combine them
* into a single response & error event.
*/
[ClientErrorInProgress]?: {
rawPacket?: Buffer;
};
/**
* Our recordings of various timestamps, used for monitoring &
* performance analysis later on
*/
[SocketTimingInfo]?: {
initialSocket: number;
initialSocketTimestamp: number;
tunnelSetupTimestamp?: number;
tlsConnectedTimestamp?: number;
};
[TlsMetadata]?: TlsSocketMetadata;
[InitialRemoteAddress]?: string;
[InitialRemotePort]?: number;
/**
* Arbitrary custom metadata that may be added during socket processing,
* e.g. with the SOCKS custom-metadata auth extension.
*
* Currently the only metadata that is exposed is `tags`, which are
* attached to each request on this connection with a `socket-metadata:`
* prefix. This can be used to provide tags during SOCKS connection
* setup that will then be visible on all 'response' event data (for
* example) later on.
*/
[SocketMetadata]?: SocketMetadata;
}
}
declare module 'tls' {
interface TLSSocket {
/**
* Have we seen evidence that the client has completed & trusts the connection?
* If set, we know that errors are client errors, not TLS setup/trust issues.
*/
[TlsSetupCompleted]?: boolean;
/**
* Extra metadata attached to a TLS socket, taken from the client hello and
* preceeding tunneling steps.
*/
[TlsMetadata]?: TlsSocketMetadata;
/**
* We cache this extra metadata during the initial TLS setup on these separate
* properties, because it can be cleared & lost from the socket in some
* TLS error scenarios.
*/
[InitialRemoteAddress]?: string;
[InitialRemotePort]?: number;
}
}
declare module 'http2' {
class Http2Session {
initialSocket?: net.Socket;
}
class ServerHttp2Stream {
[LastHopEncrypted]?: net.Socket[typeof LastHopEncrypted];
[LastTunnelAddress]?: net.Socket[typeof LastTunnelAddress];
[SocketTimingInfo]?: net.Socket[typeof SocketTimingInfo];
[SocketMetadata]?: SocketMetadata;
}
}
export type SocketIsh<MinProps extends keyof net.Socket & keyof tls.TLSSocket> = streams.Duplex & Partial<Pick<net.Socket, MinProps>> & Partial<Pick<tls.TLSSocket, MinProps>>;
//# sourceMappingURL=socket-extensions.d.ts.map