import { Validator } from "../JSONValidation";
import { RMIMessageType } from "./RMIMessageType";
/**
 * Represents a message that is sent from client to server and vice-versa. This is the base type, and should
 * be used by sub-types to represent a full message.
 */
export declare type RMIMessage<T extends RMIMessageType, D> = {
    rmi: {
        version: "1";
        id: string;
        type: T;
        data: D;
    };
};
/**
 * Creates an object that matches the {@link RMIMessage} schema. This is generally used by sub-types to
 * create full message objects.
 *
 * @param id The ID of the message to be created.
 * @param type The type of message to be created.
 * @param data The data to be inserted into this message.
 */
export declare const createRMIMessage: <T extends RMIMessageType, D>(id: string, type: T, data: D) => RMIMessage<T, D>;
/**
 * Returns a function that can be used to validate a message that should be validated as an RMI message. Assuming
 * the message conforms to the schema of an RMI message, the given dataValidator will be used to validate the inner
 * `data` property.
 *
 * @param dataValidator A function to validate the `data` property of the message.
 */
export declare const createRMIMessageValidator: <D>(dataValidator: Validator<D>) => (message: unknown) => message is RMIMessage<RMIMessageType, D>;
