import { ClientConfig, Message, Subscription } from '@google-cloud/pubsub';

type CloudSchema = {
    schemaId: string;
    avroDefinition: string;
};

type PublisherClient<T extends Record<string, unknown>> = {
    topic<K extends keyof T>(name: K, cloudSchema?: CloudSchema): {
        publish<M extends T[K]>(message: M): Promise<void>;
        initiate(): Promise<void>;
    };
};
declare const createPublisher: <T extends Record<string, unknown>>(clientOptions?: ClientConfig | undefined) => PublisherClient<T>;

type TypedMessage<T> = Omit<Message, 'data'> & {
    data: T;
};
type SubscriptionClient<T extends Record<string, unknown>> = {
    topic<K extends keyof T>(name: K, cloudSchema?: CloudSchema): {
        subscribe<M extends T[K]>(name: string, callbacks: {
            onMessage: (message: TypedMessage<M>) => Promise<void>;
            onError?: (message: TypedMessage<M>, error: unknown) => Promise<void>;
        }, options?: PubSubOptions): Promise<Subscription>;
        initiate<M extends T[K]>(name: string, options?: PubSubOptions): Promise<void>;
        close: (name: string) => Promise<void>;
        delete: (name: string) => Promise<void>;
    };
};
type PubSubOptions = {
    expirationPolicy: number;
    messageRetentionDuration: number;
    autoAck?: boolean;
};
declare const createSubscriber: <T extends Record<string, unknown>>(clientOptions?: ClientConfig | undefined) => SubscriptionClient<T>;

export { type PubSubOptions, type PublisherClient, type SubscriptionClient, type TypedMessage, createPublisher, createSubscriber };
