import type { AnyJson } from '../common/jsonTypes';
import type { Matcher } from '../v3/matchers';
import type { MatcherV2 } from './matchers';
/**
 * Metadata is a map containing message context,
 * such as content-type, correlation IDs etc.
 *
 * @module Message
 */
export interface Metadata {
    [name: string]: string | Matcher<string> | MatcherV2<string>;
}
/**
 * Defines a state a provider must be in.
 */
export interface ProviderState {
    name: string;
    params?: {
        [name: string]: string;
    };
}
/**
 * A Message is an asynchronous Interaction, sent via a Provider
 *
 * @module Message
 */
export interface Message {
    providerStates?: ProviderState[];
    description?: string;
    metadata?: Metadata;
    contents: unknown | Buffer;
}
export interface ConcreteMessage {
    providerStates?: ProviderState[];
    description?: string;
    metadata?: Metadata;
    contents: AnyJson | Buffer;
}
/**
 * A Message Descriptor is a set of additional context for a given message
 *
 * @module Message
 */
export interface MessageDescriptor {
    providerStates?: ProviderState[];
    description: string;
    metadata?: Metadata;
    content?: AnyJson | Buffer;
}
/**
 * A Message Consumer is a function that will receive a message
 * from a given Message Provider. It is given the full Message
 * context during verification.
 *
 * @module Message
 */
export type MessageConsumer = (m: ConcreteMessage) => Promise<unknown>;
export type MessageFromProvider = unknown;
export type MessageFromProviderWithMetadata = {
    __pactMessageMetadata: Record<string, string>;
    message: unknown;
};
/**
 * A Message Provider is a function that will be invoked by the framework
 * in order to _produce_ a message for a consumer. The response must match what
 * the given consumer has specified in the pact file. It is given a Message
 * Descriptor object when being invoked which can be used for additional context.
 *
 * @module Message
 */
export type MessageProvider = (m: MessageDescriptor) => Promise<MessageFromProvider | MessageFromProviderWithMetadata> | MessageFromProvider | MessageFromProviderWithMetadata;
export interface MessageProviders {
    [name: string]: MessageProvider;
}
export interface MessageStateHandlers {
    [name: string]: (state: string, params?: {
        [name: string]: string;
    }) => Promise<unknown>;
}
