/// <reference types="node" />
import { EventEmitter } from "events";
import { CrtError, mqtt_request_response } from "aws-crt";
import * as mqtt_request_response_utils from "./mqtt_request_response_utils";
export interface IncomingPublishEvent<T> {
    message: T;
}
/**
 * Signature for a handler that listens to incoming publish events.
 */
export type IncomingPublishListener<T> = (eventData: IncomingPublishEvent<T>) => void;
export interface IncomingPublishErrorEvent {
    payload: ArrayBuffer;
    error: ServiceError;
}
/**
 * Signature for a handler that listens to incoming publish error events
 */
export type IncomingPublishErrorListener = (eventData: IncomingPublishErrorEvent) => void;
export type SubscriptionStatusEventListener = mqtt_request_response.SubscriptionStatusListener;
export declare class StreamingOperation<EventType> extends EventEmitter {
    private operation;
    private deserializer;
    private constructor();
    static create<EventType>(config: mqtt_request_response_utils.StreamingOperationConfig): StreamingOperation<EventType>;
    open(): void;
    close(): void;
    /**
     * Event emitted when the stream's subscription status changes.
     *
     * Listener type: {@link mqtt_request_response.SubscriptionStatusListener}
     *
     * @event
     */
    static SUBSCRIPTION_STATUS: string;
    /**
     * Event emitted when a stream message is received
     *
     * Listener type: {@link IncomingPublishListener}
     *
     * @event
     */
    static INCOMING_PUBLISH: string;
    /**
     * Event emitted when a stream message is received but handling it resulted in an error
     *
     * Listener type: {@link IncomingPublishErrorListener}
     *
     * @event
     */
    static INCOMING_PUBLISH_ERROR: string;
    on(event: 'subscriptionStatus', listener: mqtt_request_response.SubscriptionStatusListener): this;
    on(event: 'incomingPublish', listener: IncomingPublishListener<EventType>): this;
    on(event: 'incomingPublishError', listener: IncomingPublishErrorListener): this;
    private onSubscriptionStatusChanged;
    private onIncomingPublish;
}
/**
 * @internal
 */
interface ServiceErrorOptions {
    description: string;
    internalError?: CrtError;
    modeledError?: any;
}
export declare class ServiceError extends Error {
    /** Optional inner/triggering error that can contain additional context. */
    readonly internalError?: CrtError;
    /** Optional service-specific modelled error data */
    readonly modeledError?: any;
    /** @internal */
    constructor(options: ServiceErrorOptions);
}
export {};
