/// <reference types="w3c-web-usb" />
import EventEmitter from 'eventemitter3';
interface PTPSendCommandOption {
    label?: string;
    opcode: number;
    parameters?: number[];
    expectedResCodes?: number[];
}
type PTPSendDataOption = PTPSendCommandOption & {
    data: ArrayBuffer;
};
type PTPReceiveDataOption = PTPSendCommandOption & {
    maxByteLength?: number;
};
interface PTPResponse {
    resCode: number;
    parameters: number[];
}
type PTPDataResponse = PTPResponse & {
    data: ArrayBuffer;
};
export interface PTPEvent {
    eventCode: number;
    parameters: number[];
}
type PTPEventCallback = (event: PTPEvent) => void;
interface EventTypes {
    [name: `ptpevent:${string}`]: PTPEvent;
    idle: void;
    disconnect: void;
}
interface PTPDeviceOptions {
    log?: boolean;
}
export declare class PTPDevice extends EventEmitter<EventTypes> {
    #private;
    readonly usb: USBDevice;
    constructor(usb: USBDevice, { log }?: PTPDeviceOptions);
    open: () => Promise<void>;
    close: () => Promise<void>;
    get opened(): boolean;
    setLog(log: boolean): void;
    onEventCode(eventCode: number, callback: PTPEventCallback): void;
    offEventCode(eventCode: number, callback?: PTPEventCallback): void;
    sendCommand: (option: PTPSendCommandOption) => Promise<PTPResponse | void>;
    sendData: (option: PTPSendDataOption) => Promise<PTPResponse>;
    receiveData: (option: PTPReceiveDataOption) => Promise<PTPDataResponse>;
    waitEvent: (code: number) => Promise<PTPEvent>;
}
export {};
