import type { ObjectSchema, SchemaType } from '@collaborne/json-schema-to-type';
import { CustomResourceRequest, ResponseStatus } from './cfn-response';
import { Logger } from './logger';
export interface Response<ResourceAttributes extends unknown> {
    physicalResourceId?: string;
    attributes?: ResourceAttributes;
}
/**
 * Response returned by the resource methods to indicate that long-running continuation is needed
 */
export interface ContinuationRequired<ContinuationAttributes extends unknown> {
    /** Number of seconds after which to retry the function */
    continuationAfter: number;
    /** Additional properties that should be provided in the continuation invocation */
    continuationAttributes: ContinuationAttributes;
}
declare type ContinuedCustomResourceRequest<ContinuationAttributes> = CustomResourceRequest & {
    ContinuationAttributes: ContinuationAttributes;
};
export declare abstract class CustomResource<ResourceAttributes extends unknown, S extends ObjectSchema, ContinuationAttributes extends unknown = unknown> {
    protected readonly schema: S;
    protected readonly logicalResourceId: string;
    protected readonly logger: Logger;
    private static CW_EVENTS_TARGET_ID;
    private cwEvents;
    private requestQueue;
    private currentRequest?;
    constructor(schema: S, logicalResourceId: string, logger: Logger);
    abstract createResource(physicalResourceId: string, params: SchemaType<S>, continuationAttributes?: ContinuationAttributes): Promise<Response<ResourceAttributes> | ContinuationRequired<ContinuationAttributes>>;
    abstract deleteResource(physicalResourceId: string, params: SchemaType<S>, continuationAttributes?: ContinuationAttributes): Promise<Response<ResourceAttributes> | ContinuationRequired<ContinuationAttributes>>;
    abstract updateResource(physicalResourceId: string, params: SchemaType<S>, oldParams: unknown, continuationAttributes?: ContinuationAttributes): Promise<Response<ResourceAttributes> | ContinuationRequired<ContinuationAttributes>>;
    handleRequest(request: CustomResourceRequest | ContinuedCustomResourceRequest<ContinuationAttributes>): Promise<ResponseStatus>;
    /**
     * Get the request that is currently being processed
     *
     * This is mostly intended for integrations that want to watch the state of their
     * resources, the returned value should not be changed in any way.
     *
     * @returns the current request when called during an execution of {@link handleRequest}, otherwise `undefined`
     */
    get request(): undefined | CustomResourceRequest | ContinuedCustomResourceRequest<ContinuationAttributes>;
    protected handleRequestInner(request: CustomResourceRequest | ContinuedCustomResourceRequest<ContinuationAttributes>): Promise<ResponseStatus>;
    protected processRequest(request: CustomResourceRequest | ContinuedCustomResourceRequest<ContinuationAttributes>): Promise<{
        status: ResponseStatus;
    }>;
    private getContinuationRuleName;
}
export {};
