/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
interface Partition {
    binary: Uint8Array;
    readonly offset: number;
    readonly filename: string;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

declare class ESPImage {
    partitions: Array<Partition>;
    addBootloader(fileName: string): void;
    addPartitionTable(fileName: string): void;
    addApp(fileName: string): void;
    addPartition(partition: Partition): void;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Interface defining the properties of a serial connection.
 */
interface SerialConnection {
    /** The underlying SerialPort object. Undefined if no port is selected. */
    port: SerialPort | undefined;
    /** Indicates if the serial port is currently open and connected. */
    connected: boolean;
    /** Indicates if the connection has been synchronized with the device. */
    synced: boolean;
    /** The readable stream for receiving data from the serial port. Null if not connected. */
    readable: ReadableStream<Uint8Array> | null;
    /** The writable stream for sending data to the serial port. Null if not connected. */
    writable: WritableStream<Uint8Array> | null;
    /** An AbortController to signal termination of stream operations. Undefined if not connected. */
    abortStreamController: AbortController | undefined;
    /** A readable stream that contains the slipstream decoded responses from the esp. */
    commandResponseStream: ReadableStream<Uint8Array> | undefined;
}
declare class SerialController extends EventTarget {
    connection: SerialConnection;
    constructor();
    private createSerialConnection;
    requestPort(): Promise<void>;
    createLogStreamReader(): () => AsyncGenerator<string | undefined, void, unknown>;
    openPort(options?: SerialOptions): Promise<void>;
    disconnect(): Promise<void>;
    sendResetPulse(): Promise<void>;
    writeToConnection(data: Uint8Array): Promise<void>;
    sync(): Promise<boolean>;
    private readResponse;
    flashPartition(partition: Partition): Promise<void>;
    flashImage(image: ESPImage): Promise<void>;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

declare class BinFilePartition implements Partition {
    readonly offset: number;
    readonly filename: string;
    binary: Uint8Array;
    constructor(offset: number, filename: string);
    load(): Promise<boolean>;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

declare class NVSPartition implements Partition {
    readonly offset: number;
    readonly filename: string;
    size: number;
    private namespaces;
    private pages;
    constructor(offset: number, filename: string, size?: number);
    private newPage;
    private getLastPage;
    private getNameSpaceIndex;
    get binary(): Uint8Array;
    writeEntry(namespace: string, key: string, data: string | number): void;
    private write;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
declare enum PartitionType {
    APP = 0,
    DATA = 1
}
declare enum AppPartitionSubType {
    FACTORY = 0,
    OTA_0 = 16,
    OTA_1 = 17,
    OTA_2 = 18,
    OTA_3 = 19,
    OTA_4 = 20,
    OTA_5 = 21,
    OTA_6 = 22,
    OTA_7 = 23,
    OTA_8 = 24,
    OTA_9 = 25,
    OTA_10 = 26,
    OTA_11 = 27,
    OTA_12 = 28,
    OTA_13 = 29,
    OTA_14 = 30,
    OTA_15 = 31,
    TEST = 32
}
declare enum DataPartitionSubType {
    OTA = 0,
    PHY = 1,
    NVS = 2,
    NVS_KEYS = 4,
    SPIFFS = 130
}
interface PartitionFlags {
    encrypted: boolean;
    readonly: boolean;
}
interface PartitionDefinition {
    name: string;
    type: PartitionType;
    subType: AppPartitionSubType | DataPartitionSubType;
    offset?: number;
    size: number;
    flags?: Partial<PartitionFlags>;
}

/**
 * Copyright 2025 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

declare class PartitionTable implements Partition {
    private entries;
    readonly offset = 32768;
    readonly filename = "partition-table.bin";
    constructor(definitions: PartitionDefinition[]);
    private processDefinitions;
    get binary(): Uint8Array;
    toBinary(enableMD5?: boolean): Uint8Array;
    static singleFactoryAppNoOta(): PartitionTable;
    static factoryAppTwoOtaDefinitions(): PartitionTable;
}

export { AppPartitionSubType, BinFilePartition, DataPartitionSubType, ESPImage, NVSPartition, type Partition, type PartitionDefinition, type PartitionFlags, PartitionTable, PartitionType, type SerialConnection, SerialController };
